Cảm biến LM35 là cảm biến tương tự vì vậy ta phải dùng bộ ADC chuyển sang tương tự thì mới tính toán được nhiệt độ.
Ta có: U= t.k u là điện áp đầu ra
t là nhiệt độ môi trường đo, k là hệ số theo nhiệt độ của LM35 10mV/1 độ C
Điện áp cấp cho LM35 là 5V ADC 12bit
Vậy bước thay đổi của LM35 sẽ là 5/(2^12) = 5/4096 Giá trị ADC đo được thì điện áp đầu vào của LM35 là (t*k)/(5/4096) = ((10^-2)*4096*t)/5 = 4.096*t
Vậy nhiệt độ ta đo được t = giá trị ADC/4096 Tính nhiệt độ trong đề tài:
coun_adc = 0; sum_adc = 0; while(coun_adc < 3000){ adc = read_adc(); sum_adc += adc; coun_adc++; }; tdo_1 = sum_adc/30000;
3.2.3 Cách tính toán PWM duty trong đề tài
Các ký hiệu:
+ Kp, Ki, Kd lần lượt là các hệ số Kp,Ki, Kd. + err là sai lệch hiện tại (trong lúc đang xét). + pre_err là sai lệch ngay trước đó.
+ e_sum là tổng của tất cả các sai lệch từ lúc bắt đầu đến thời điểm đang xét.
+ t_da là nhiệt độ đặt (oc).
+ t_do là nhiệt độ đo đọc được từ cảm biến LM35. + duty là độ rộng của xung PWM.
- Cách tính:
#define period 5000 err_1 = tda_1 - tdo_1;
p_part_1 = (signed int32)kp_1*err_1; if(p_part_1 > period){p_part_1 = period;}; if(p_part_1 < -period){p_part_1 =- period;}; if(ki_1 != 0){
i_part_1 += ((signed int32)ki_1*err_1); }
else{
i_part_1 = 0; };
if(i_part_1 > period){i_part_1 = period;}; if(i_part_1 < -period){i_part_1 =- period;};
if(tdo_1 >= tda_1){i_part_1 = 0;}; d_part_1=((signed int32)kd_1*(err_1 - pre_err_1)); if(d_part_1 > period){d_part_1 = period;};
if(d_part_1 < -period){d_part_1 =- period;}; pre_err_1 = err_1; output_1 = p_part_1 + i_part_1 + d_part_1; if(output_1 > period){output_1 = period;}; if(output_1 < 0){output_1 = 0;};
if(tdo_1 > tda_1){output_1 = 0;}; temp = output_1*65472/period; set_pwm_duty(1,temp);