Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Exemplo - Controlador Proporcional Integral
- #include <18F4550.h>
- #device PASS_STRINGS = IN_RAM
- #device adc=10; //ADC de 10 bits
- #build (reset = 0 x 1000, interrupt = 0 x 1008)
- #org 0x000, 0xfff{} //Para uso do BootLoader
- #fuses hs,cpudiv1,nowdt,noprotect,put, brownout, nolvp, nocpd,nowrt
- #use delay(clock=20000000)
- #use I2C(MASTER, stream = SSD1306_STREAM, SCL=pin_b3,SDA = pin_b2)
- #include <math.h>
- #include <SSD1306OLED_LIB.c>
- //#use fast_io(b)
- #define dT 0.01
- int1 update=0;
- float erro, setpoint, v_ntc, T, R_ntc;
- float P,I = 0;
- float Saida;
- int16 Saida_PWM;
- int16 j,cont,cont2,valor;
- int16 Kp = 50;
- float Ki = 0.5;
- #int_TIMER1
- void TIMER1_isr(void)
- {
- set_timer1(15535); // dT = 10 ms
- //output_toggle(pin_b7);
- cont++;
- update = 1;
- }
- float func_read_temp(){ //**Cálculo de temperatura baseado nos estudos de Hart**//
- float medidoNTC, //**Cria uma variável que será tratada como a resistência medida pelo sensor de temperatura, no caso um NTC**//
- temperatura_final, //**Cria uma variável que será tratada como temperatura final lida, já convertida de K para C**//
- rNTc; //**Cria uma variável que será utilizada no cálculo da resistência do NTC por método divisor de tensão**//
- int32 i; //Cria uma variável que será utilizada no FOR**//
- int16 valor_adc; //Cria uma variável que será tratada como valor lido no CONVERSOR AD, ou seja, de 0 a 1023 (10bits)**//
- float const beta = 3830.0; //**valor beta do ntc (disponibilizado pelo professor)**//
- float const _T0 = 1.0/298.15; //**inverso de 298,15 (25ºc)**//
- float const Ro = 10000.0; //**resistência do ntc a 25ºC**//
- float const R_pull_up = 10000.0; //**resistência de pull-up do NTC**//
- valor_adc = 0;
- for(i=0;i<=15;i++){
- valor_adc+=read_adc();
- delay_ms(5);
- }
- valor_adc/=16;
- medidoNTC=5 * valor_adc/1023.0;
- 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**//
- temperatura_final=log(rNTC/Ro); //**obtém o log n do valor R lido/resistencia a 25 graus**//
- temperatura_final/= beta; //**divide pelo 'beta'**//
- temperatura_final+=_T0; //**soma o valor nominal invertido**//
- temperatura_final=1/temperatura_final; //**inverte**//
- temperatura_final-= 273.15;
- return temperatura_final;
- }
- void main()
- {
- setpoint = 30;
- //
- set_tris_b(0b00000000);
- // Configuração das interrupções (Se houver)
- enable_interrupts(INT_TIMER1);
- enable_interrupts(GLOBAL);
- // Configura o período de amostragem (período de interrupção do TIMER 2)
- setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // dT = 13.1 ms
- // Configuração do Timer 2
- setup_timer_2 (T2_DIV_BY_1, 249, 1); // Freq. PWM = 20 kHz
- // Configuração do módulo CCP
- setup_ccp1(CCP_PWM); // Configura CCP1 para modo PWM
- setup_ccp2(CCP_PWM); // Configura CCP2 para modo PWM
- set_pwm1_duty(500); // Configura o ciclo ativo em 0 (desligado)
- set_pwm2_duty(0); // Configura o ciclo ativo em 0 (desligado)
- // Configuração do conversor A/D
- setup_adc_ports(AN0_TO_AN1|VSS_VDD); //////////////////////////////////////////////////////-----------------////////////////////////////////////////////
- setup_adc(ADC_CLOCK_INTERNAL);
- char vDesejado[20],
- vTemperatura[20];
- SSD1306_ClearDisplay(); //**Limpa o display gráfico**//
- SSD1306_Begin(SSD1306_SWITCHCAPVCC, SSD1306_I2C_ADDRESS);
- while(TRUE)
- {
- T = func_read_temp();
- sprintf(vDesejado, "SP: %2.2f", setpoint);
- sprintf(vTemperatura, "Now:%2.2f", T);
- erro = setpoint - T;
- //erro = 10;
- P = Kp*erro;
- if(update==1)
- {
- I = I + Ki*erro*dT;
- update = 0;
- }
- Saida = P+I;
- if(Saida>1000)
- {
- Saida = 1000;
- }
- else
- if(Saida<0)
- {
- Saida = 0;
- }
- Saida_PWM = (int16) Saida;
- set_pwm1_duty (Saida_PWM); // resolução de 10 bits - 0 a 1023
- // Comandos para exibir informações no display
- if(cont==5)
- {
- SSD1306_ClearDisplay();
- SSD1306_DrawRoundRect(5, 5, 62, 20, 3);
- SSD1306_DrawText(10, 10, vDesejado, 1);
- SSD1306_DrawText(5, 35, vTemperatura, 2);
- //Espaço para a printagem do display
- cont=0;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement