Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.73 KB | None | 0 0
  1. // Exemplo - Controlador Proporcional Integral
  2.  
  3. #include <18F4550.h>
  4. #device PASS_STRINGS = IN_RAM
  5. #device adc=10; //ADC de 10 bits
  6.  
  7. #build (reset = 0 x 1000, interrupt = 0 x 1008)
  8. #org 0x000, 0xfff{} //Para uso do BootLoader
  9. #fuses hs,cpudiv1,nowdt,noprotect,put, brownout, nolvp, nocpd,nowrt
  10. #use delay(clock=20000000)
  11. #use I2C(MASTER, stream = SSD1306_STREAM, SCL=pin_b3,SDA = pin_b2)
  12. #include <math.h>
  13.  
  14. #include <SSD1306OLED_LIB.c>
  15.  
  16.  
  17. //#use fast_io(b)
  18.  
  19.  
  20. #define dT 0.01
  21.  
  22. int1 update=0;
  23. float erro, setpoint, v_ntc, T, R_ntc;
  24. float P,I = 0;
  25. float Saida;
  26. int16 Saida_PWM;
  27.  
  28. int16 j,cont,cont2,valor;
  29. int16 Kp = 50;
  30. float Ki = 0.5;
  31.  
  32. #int_TIMER1
  33. void TIMER1_isr(void)
  34. {
  35. set_timer1(15535); // dT = 10 ms
  36. //output_toggle(pin_b7);
  37. cont++;
  38. update = 1;
  39. }
  40.  
  41. float func_read_temp(){ //**Cálculo de temperatura baseado nos estudos de Hart**//
  42. float medidoNTC, //**Cria uma variável que será tratada como a resistência medida pelo sensor de temperatura, no caso um NTC**//
  43. temperatura_final, //**Cria uma variável que será tratada como temperatura final lida, já convertida de K para C**//
  44. rNTc; //**Cria uma variável que será utilizada no cálculo da resistência do NTC por método divisor de tensão**//
  45.  
  46.  
  47. int32 i; //Cria uma variável que será utilizada no FOR**//
  48. int16 valor_adc; //Cria uma variável que será tratada como valor lido no CONVERSOR AD, ou seja, de 0 a 1023 (10bits)**//
  49.  
  50. float const beta = 3830.0; //**valor beta do ntc (disponibilizado pelo professor)**//
  51. float const _T0 = 1.0/298.15; //**inverso de 298,15 (25ºc)**//
  52. float const Ro = 10000.0; //**resistência do ntc a 25ºC**//
  53. float const R_pull_up = 10000.0; //**resistência de pull-up do NTC**//
  54.  
  55. valor_adc = 0;
  56. for(i=0;i<=15;i++){
  57. valor_adc+=read_adc();
  58. delay_ms(5);
  59. }
  60. valor_adc/=16;
  61.  
  62.  
  63. medidoNTC=5 * valor_adc/1023.0;
  64. rNTC=medidoNTC * R_pull_up / (5 - medidoNTC); //**Como determinado em aula, esta equação permite o cálculo da resistência do NTC por método divisor de tensão**//
  65.  
  66. temperatura_final=log(rNTC/Ro); //**obtém o log n do valor R lido/resistencia a 25 graus**//
  67. temperatura_final/= beta; //**divide pelo 'beta'**//
  68. temperatura_final+=_T0; //**soma o valor nominal invertido**//
  69. temperatura_final=1/temperatura_final; //**inverte**//
  70. temperatura_final-= 273.15;
  71.  
  72. return temperatura_final;
  73. }
  74.  
  75. void main()
  76. {
  77. setpoint = 30;
  78. //
  79.  
  80.  
  81. set_tris_b(0b00000000);
  82. // Configuração das interrupções (Se houver)
  83.  
  84. enable_interrupts(INT_TIMER1);
  85. enable_interrupts(GLOBAL);
  86.  
  87. // Configura o período de amostragem (período de interrupção do TIMER 2)
  88.  
  89. setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // dT = 13.1 ms
  90.  
  91. // Configuração do Timer 2
  92.  
  93. setup_timer_2 (T2_DIV_BY_1, 249, 1); // Freq. PWM = 20 kHz
  94.  
  95. // Configuração do módulo CCP
  96.  
  97. setup_ccp1(CCP_PWM); // Configura CCP1 para modo PWM
  98. setup_ccp2(CCP_PWM); // Configura CCP2 para modo PWM
  99. set_pwm1_duty(500); // Configura o ciclo ativo em 0 (desligado)
  100. set_pwm2_duty(0); // Configura o ciclo ativo em 0 (desligado)
  101.  
  102. // Configuração do conversor A/D
  103.  
  104. setup_adc_ports(AN0_TO_AN1|VSS_VDD); //////////////////////////////////////////////////////-----------------////////////////////////////////////////////
  105. setup_adc(ADC_CLOCK_INTERNAL);
  106.  
  107. char vDesejado[20],
  108. vTemperatura[20];
  109.  
  110. SSD1306_ClearDisplay(); //**Limpa o display gráfico**//
  111. SSD1306_Begin(SSD1306_SWITCHCAPVCC, SSD1306_I2C_ADDRESS);
  112.  
  113. while(TRUE)
  114. {
  115. T = func_read_temp();
  116.  
  117. sprintf(vDesejado, "SP: %2.2f", setpoint);
  118. sprintf(vTemperatura, "Now:%2.2f", T);
  119.  
  120. erro = setpoint - T;
  121. //erro = 10;
  122.  
  123. P = Kp*erro;
  124.  
  125. if(update==1)
  126. {
  127. I = I + Ki*erro*dT;
  128. update = 0;
  129. }
  130.  
  131. Saida = P+I;
  132.  
  133. if(Saida>1000)
  134. {
  135. Saida = 1000;
  136. }
  137. else
  138. if(Saida<0)
  139. {
  140. Saida = 0;
  141. }
  142. Saida_PWM = (int16) Saida;
  143.  
  144. set_pwm1_duty (Saida_PWM); // resolução de 10 bits - 0 a 1023
  145.  
  146. // Comandos para exibir informações no display
  147.  
  148. if(cont==5)
  149. {
  150. SSD1306_ClearDisplay();
  151. SSD1306_DrawRoundRect(5, 5, 62, 20, 3);
  152. SSD1306_DrawText(10, 10, vDesejado, 1);
  153. SSD1306_DrawText(5, 35, vTemperatura, 2);
  154. //Espaço para a printagem do display
  155. cont=0;
  156. }
  157.  
  158.  
  159. }
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement