一波PID控制電壓帶仿真的程序送給51hei的朋友!希望給你們有所幫助!
51單片機與ADC0832芯片PID控制電壓的仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (17.63 KB, 下載次數: 52)
下載附件
2018-5-2 16:31 上傳
0.png (54.05 KB, 下載次數: 44)
下載附件
2018-5-2 16:31 上傳
8Z(MYH~17T9QAUO}0F3IXP3.png (51.5 KB, 下載次數: 39)
下載附件
部分截圖
2018-5-2 11:36 上傳
5W27WJP2)PHC%@8J@5T)5R1.png (67 KB, 下載次數: 44)
下載附件
部分截圖
2018-5-2 11:36 上傳
UKPTQ1X2GTL{5LDW(8$D0]B.png (56.4 KB, 下載次數: 50)
下載附件
部分截圖
2018-5-2 11:36 上傳
單片機源程序如下:
- #include<reg52.h>
- #include "ADC.h"
- #include "LCD1602.h"
- #include "PID.h"
- uchar str[]="Set the voltage!";
-
- float INPUT=2.5;
- float out;
- uchar DA,AD;//AD,DA為0-255
- void key_process()
- {
- uchar key;
- if(P3==0xff)
- {
- delay(100);
-
- key=P3;
- switch (key)
- {
- case 0xFE: INPUT=INPUT+1; break;
- case 0xFD: INPUT=INPUT-1; break;
- case 0xFB: INPUT=INPUT+0.1; break;
- case 0xF7: INPUT=INPUT-0.1; break;
- case 0xEF: INPUT=INPUT+0.01; break;
- case 0xDF: INPUT=INPUT-0.01; break;
- default: break;
- }
- if(INPUT>5.0)
- {
- INPUT=5.0;
- }
- else if(INPUT<0.0)
- {
- INPUT=0.0;
- }
- }
- }
- void LCD_voltage()
- {
- uint voltage;
- uchar i;
- uchar tab[5];
- voltage=(uint)(INPUT*100);
- tab[0]=voltage/100+'0';
- tab[1]='.';
- tab[2]=voltage%100/10+'0';
- tab[3]=voltage%10+'0';
- tab[4]='V';
- write_com(0xc0);
- for(i=0;i<5;i++)
- {
- write_data(tab[i]);
- }
- }
- void main()
- {
- uchar i;
- pid_init();
- LCD_init();
- write_com(0x80);
- for(i=0;i<16;i++)
- write_data(str[i]);
- while(1)
- {
- key_process();
- LCD_voltage();
- out=pid_process();//讀取PID運算結果
- DA=(uchar)(out*255/5);//轉換成DA數據
- P0=DA; //轉換成對應的電壓值
- AD=ADC0832(0); //AD采集DA所輸出的電壓值
- y_cur=(float)AD*5/255;//反饋給PID
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
PID控制電壓.zip
(128 KB, 下載次數: 171)
2018-5-2 11:37 上傳
點擊文件名下載附件
主程序 下載積分: 黑幣 -5
|