0 - 180 degrees with MPU-6050?

Hi guys, I’m currently working on a project that uses mpu-6050 for some angle measurements, but I’m having a problem with angle range.
Basically, my code works pretty fine for a range of -90º to +90º when the 0º angle reference is the sensor parallel to a horizontal table (for example). However, my project requires that the sensor remains perpendicular to the table, that is, a 90º angle shift and that is the main problem. When the sensor is put vertically and I add a 90º shift to set a 0º reference for the vertical position, the angle range starts at 0º, increases until it reaches 90º and afterwards, decreases to 0º again, that is, the sensor doesn’t go further than 90º. I need an angle range of -90º to +90º or 0º - 180º for my project to works. Any suggestion?

Extra information: I’m using three sensors for three different measurements and the comments are in Portuguese, but the main code is in English. Also, the code below is just for one sensor, the other two are exactly the same with changed variable names.

void read_mpu_6050_data_cervical() {                                        //subrotina para leitura dos dados brutos do giroscópio e acelerômetro
  Wire.beginTransmission(0x68);                                             //inicia a comunicação com o MPU-6050
  Wire.write(0x3B);                                                         //envia o solicitado registrador de inicialização
  Wire.endTransmission();                                                   //encerra a transmissão
  Wire.requestFrom(0x68,14);                                                //solicita 14 bytes do MPU-6050
  while(Wire.available() < 14);                                            //agurda até que todos os bytes sejam recebido
  acc_x_c = Wire.read()<<8|Wire.read();                                     //adiciona o menor e o maior byte para a variável acc_x 
  acc_y_c = Wire.read()<<8|Wire.read();                                     //adiciona o menor e o maior byte para a variável acc_y
  acc_z_c = Wire.read()<<8|Wire.read();                                     //adiciona o menor e o maior byte para a variável acc_z
  temperature_c = Wire.read()<<8|Wire.read();                               //adiciona o menor e o maior byte para a variável temperature
  gyro_x_c = Wire.read()<<8|Wire.read();                                    //adiciona o menor e o maior byte para a variável gyro_x 
  gyro_y_c = Wire.read()<<8|Wire.read();                                    //adiciona o menor e o maior byte para a variável gyro_y 
  gyro_z_c = Wire.read()<<8|Wire.read();                                    //adiciona o menor e o maior byte para a variável gyro_z 
}

void mpu_calculos_cervical() {                                              //subrotina dedicada à calcular a inclinação e rotação do módulo MPU-6050 em graus
  read_mpu_6050_data_cervical();                                            //lê os dados brutos do MPU-6050
  
  gyro_x_c -= gyro_x_cal;                                                   //subtrai o valor de offset de calibração do valor gyro_x 
  gyro_y_c -= gyro_y_cal;                                                   //subtrai o valor de offset de calibração do valor gyro_y 
  gyro_z_c -= gyro_z_cal;                                                   //subtrai o valor de offset de calibração do valor gyro_z 
  
  //cálculos dos ângulos do giroscópio
  //0.000031 = 1 / (250Hz / 131)

  angle_pitch_c += gyro_x_c * 0.000031;                                      //calcula o ângulo de inclinação e adiciona ele na variável angle_pitch
  angle_roll_c += gyro_y_c * 0.000031;                                       //calcula o ângulo de rotação e adiciona ele na variável angle_roll 
  
  //0.000000541 = 0.000031 * (3.142(PI) / 180graus) a função seno do arduino é em radianos

  angle_pitch_c += angle_roll_c * sin(gyro_z_c * 0.000000541);               //se o IMU guinou, transfere o ângulo de rotação para o ângulo de inclinação
  angle_roll_c -= angle_pitch_c * sin(gyro_z_c * 0.000000541);               //se o IMU guinou, transfere o ângulo de inclinação para o ângulo de rotação  
  
  //cálculos dos ângulos do acelerômetro

  acc_total_vector_c = sqrt((acc_x_c*acc_x_c)+(acc_y_c*acc_y_c)+(acc_z_c*acc_z_c));  //calcula o vetor de aceleração total

  //57.296 = 1 / (3.142 / 180) The Arduino asin function is in radians

  angle_pitch_acc_c = asin((float)acc_y_c/acc_total_vector_c)* 57.296;       //calcula o ângulo de inclinação
  angle_roll_acc_c = asin((float)acc_x_c/acc_total_vector_c)* -57.296;       //calcula o ângulo de rotação
  
  //Calibração dos ângulos de posição inicial OBS: Nesse caso o padrão é o MPU-6050 posto na vertical(90 graus)

  angle_pitch_acc_c -= 0.0;                                                  //valor de calibração da inclinação do acelerômetro
  angle_roll_acc_c -= 0.0;                                                   //valor de calibração da rotação do acelerômetro

  if(set_gyro_angles_c){                                                     //se o IMU já foi iniciado
    angle_pitch_c = angle_pitch_c * 0.9 + angle_pitch_acc_c * 0.1;           //corrige o desvio do ângulo de inclinação do giroscópio com o ângulo de inclinação do acelerômetro
    angle_roll_c = angle_roll_c * 0.9 + angle_roll_acc_c * 0.1;              //corrige o desvio do ângulo de rotação do giroscópio com o ângulo de rotação do acelerômetro
  }
  else{                                                                      //no momento inicial
    angle_pitch_c = angle_pitch_acc_c;                                       //define o ângulo de inclinação do giroscópio igual ao ângulo de inclinação do acelerômetro 
    angle_roll_c = angle_roll_acc_c;                                         //define o ângulo de rotação do giroscópio igual ao ângulo de rotação do acelerômetro
    set_gyro_angles_c = true;                                                //define a flag de incio do IMU
  }
  
  //Para suavizar os ângulos de inclinação e rotação, um filtro complementar é usado

  angle_pitch_output_c = angle_pitch_output_c * 0.9 + angle_pitch_c * 0.1;   //utiliza 90% do valor de saída do ângulo de inclinação e adiciona 10% do valor bruto de inclinação
  angle_roll_output_c = angle_roll_output_c * 0.9 + angle_roll_c * 0.1;      //utiliza 90% do valor de saída do ângulo de rotação e adiciona 10% do valor bruto de rotação
  
  while(micros() - loop_timer < 4000);                                       //espera até que o loop_timer atinga 4ms(250Hz) antes de começar o próximo loop
  loop_timer = micros();                                                     //reseta o loop_timer
}

For static tilt measurements, there is no need to use the gyro.

I recommend to read the material and to use the much simpler code on this site.

Use whatever axis will be vertical on the sensor as the "Z" axis and there will be no need to transform the angles.