PWM直流電機調速仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
E11V1WL1[%1_$@HCBPJMK_A.png (18.42 KB, 下載次數: 53)
下載附件
2019-1-4 19:42 上傳
Altium Designer畫的PWM直流電機調速原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (57.67 KB, 下載次數: 45)
下載附件
2019-1-5 01:21 上傳
0.png (37.8 KB, 下載次數: 34)
下載附件
2019-1-5 01:21 上傳
里面包含PCB封裝庫文件:
0.png (45.32 KB, 下載次數: 47)
下載附件
2019-1-5 01:21 上傳
PWM直流電機調速單片機程序如下
- #include <reg51.h>
- #include <intrins.h>
- #include "LCD1602.h"
- #define uchar unsigned char
- #define uint unsigned int
- /**********端口分配*******************************/
- sbit add_key=P1^0; //占空比加
- sbit dec_key=P1^1; //占空比減
- sbit z_key=P1^2; //正轉鍵
- sbit f_key=P1^3; //反轉鍵
- sbit run_key=P1^4; //啟動/停止鍵
-
- sbit beep=P3^2;
- //電機驅動相關
- sbit ENA=P3^5;
- sbit IN1=P3^7;
- sbit IN2=P3^4;
- /**********變量定義*******************************/
- //電機相關定義
- bit Rotation_f=0; //步進電機旋轉狀態標志 為0正轉 1反轉
- bit power_flag=0; //總開關標志
- #define PWM_cnt_LEN 100 //計數全長
- #define PWM_ON 1 //開
- #define PWM_OFF 0 //關
- uint PWM_cnt; //PWM計數
- uchar PWM_duty; //PWM占空比
- uint speed_cnt=0; //轉速
- uint speed_value;
- bit dis_speed_flag=0;
- uint delay_cnt;
- uchar dis_buf[6];
- uchar dis_cnt;
- uchar dis_buf1[4];
- uchar dis_cnt1;
- /*********定義延時1ms子程序************************/
- void delay1ms(uint t)//1ms延時子程序
- {
- uint k,j;
- for(k=0;k<t;k++)
- for(j=0;j<120;j++);
- }
- /**************************************************/
- /**********蜂鳴器報警**********************/
- void beep_alarm()
- {
- beep=0;
- delay1ms(100);
- beep=1;
- }
- /*******************************************/
- /**********電機停止********************/
- void motor_stop()
- {
- IN1=1;
- IN2=1;
- }
- /***************************************/
- /*******電機正轉********************/
- void motor_foreward()
- {
- IN1=1;
- IN2=0;
- }
- /************************************/
- /********電機反轉**********************/
- void motor_reversal()
- {
- IN1=0;
- IN2=1;
- }
- /*****************************************/
- /************顯示轉速*********************/
- void dis_speed()
- {
- dis_cnt=0;
- if(speed_value/10000!=0)
- {
- dis_buf[dis_cnt]=speed_value/10000+0x30;
- dis_cnt++;
- dis_buf[dis_cnt]=speed_value%10000/1000+0x30;
- dis_cnt++;
- dis_buf[dis_cnt]=speed_value%1000/100+0x30;
- dis_cnt++;
- dis_buf[dis_cnt]=speed_value%100/10+0x30;
- dis_cnt++;
- dis_buf[dis_cnt]=speed_value%10+0x30;
- dis_cnt++;
- }
- else if(speed_value%10000/1000!=0)
- {
- dis_buf[dis_cnt]=' ';
- dis_cnt++;
- dis_buf[dis_cnt]=speed_value%10000/1000+0x30;
- dis_cnt++;
- dis_buf[dis_cnt]=speed_value%1000/100+0x30;
- dis_cnt++;
- dis_buf[dis_cnt]=speed_value%100/10+0x30;
- dis_cnt++;
- dis_buf[dis_cnt]=speed_value%10+0x30;
- dis_cnt++;
- }
- else if(speed_value%1000/100!=0)
- {
- dis_buf[dis_cnt]=' ';
- dis_cnt++;
- dis_buf[dis_cnt]=' ';
- dis_cnt++;
- dis_buf[dis_cnt]=speed_value%1000/100+0x30;
- dis_cnt++;
- dis_buf[dis_cnt]=speed_value%100/10+0x30;
- dis_cnt++;
- dis_buf[dis_cnt]=speed_value%10+0x30;
- dis_cnt++;
- }
- else if(speed_value%100/10!=0)
- {
- dis_buf[dis_cnt]=' ';
- dis_cnt++;
- dis_buf[dis_cnt]=' ';
- dis_cnt++;
- dis_buf[dis_cnt]=' ';
- dis_cnt++;
- dis_buf[dis_cnt]=speed_value%100/10+0x30;
- dis_cnt++;
- dis_buf[dis_cnt]=speed_value%10+0x30;
- dis_cnt++;
- }
- else
- {
- dis_buf[dis_cnt]=' ';
- dis_cnt++;
- dis_buf[dis_cnt]=' ';
- dis_cnt++;
- dis_buf[dis_cnt]=' ';
- dis_cnt++;
- dis_buf[dis_cnt]=' ';
- dis_cnt++;
- dis_buf[dis_cnt]=speed_value%10+0x30;
- dis_cnt++;
- }
- dis_buf[dis_cnt]='\0';
- LCD1602_Print(2,0,dis_buf); //顯示轉速
- }
- /*****************************************/
- /**********顯示占空比*********************/
- void dis_duty()
- {
- dis_cnt1=0;
- if(PWM_duty/100!=0)
- {
- dis_buf1[dis_cnt1]=PWM_duty/100+0x30;
- dis_cnt1++;
- dis_buf1[dis_cnt1]=PWM_duty%100/10+0x30;
- dis_cnt1++;
- dis_buf1[dis_cnt1]=PWM_duty%10+0x30;
- dis_cnt1++;
- }
- else if(PWM_duty%100/10!=0)
- {
- dis_buf1[dis_cnt1]=' ';
- dis_cnt1++;
- dis_buf1[dis_cnt1]=PWM_duty%100/10+0x30;
- dis_cnt1++;
- dis_buf1[dis_cnt1]=PWM_duty%10+0x30;
- dis_cnt1++;
- }
- else
- {
- dis_buf1[dis_cnt1]=' ';
- dis_cnt1++;
- dis_buf1[dis_cnt1]=' ';
- dis_cnt1++;
- dis_buf1[dis_cnt1]=PWM_duty%10+0x30;
- dis_cnt1++;
- }
- dis_buf1[dis_cnt1]='\0';
- LCD1602_Print(9,1,dis_buf1); //顯示占空比
- }
- /*****************************************/
- /*************定時器初始化程序*******************/
- void timer_init(void)
- {
- TMOD=0x11; //設置定時器0,1為16位模式
- TH0=0xD8; //10ms定時初值 10ms D8F0
- TL0=0xF0;
- ET0=1; //定時器0中斷開
- TR0=1; //開定時器0
- TH1=0xFF; //100us定時初值
- TL1=0x9C;
- ET1=1; //定時器1中斷開
- TR1=1; //開定時器1
- EA=1; //總中斷開
- }
- /*************************************************/
- /***********定時器0中斷服務程序*******************/
- void timer0(void) interrupt 1
- {
- TH0=0xD8; //10ms定時初值 10ms D8F0
- TL0=0xF0;
- delay_cnt++;
- if(delay_cnt>=200) //2S計時
- {
- delay_cnt=0;
- speed_value=speed_cnt*30; //30 將兩秒內的計數乘以30得到轉每分 (還要除2 因為有兩片磁鐵) 30/2=15
- speed_cnt=0;
- dis_speed_flag=1;
- }
- }
- /*************************************************/
- /**********外部中斷1服務程序**************/
- void int1() interrupt 2
- {
- speed_cnt++; //轉速
- }
- /*****************************************/
- /***********定時器1中斷服務程序*******************/
- void timer1(void) interrupt 3
- {
- TH1=0xFF; //100us定時初值
- TL1=0x9C;
- if(++PWM_cnt==PWM_cnt_LEN)
- {
- PWM_cnt=0;
- if(power_flag==1)
- ENA=PWM_ON;
- else ENA=PWM_OFF;
- }
- if(PWM_cnt==PWM_duty)
- {
- ENA=PWM_OFF;
- }
- }
- /*************************************************/
- /*******按鍵處理程序******************************/
- void key_check()
- {
- if(add_key==0) //占空比加
- {
- delay1ms(50);
- if(add_key==0)
- {
- beep_alarm(); //蜂鳴器報警
- PWM_duty++;
- if(PWM_duty>100)
- PWM_duty=100;
- dis_duty(); //顯示占空比
- }
- }
- if(dec_key==0) //占空比減
- {
- delay1ms(50);
- if(dec_key==0)
- {
- beep_alarm(); //蜂鳴器報警
- PWM_duty--;
- if(PWM_duty>100)
- PWM_duty=0;
- dis_duty(); //顯示占空比
- }
- }
- if(z_key==0) //正轉鍵
- {
- delay1ms(50);
- if(z_key==0)
- {
- beep_alarm(); //蜂鳴器報警
- Rotation_f=0; //步進電機旋轉狀態標志 為0正轉 1反轉
- LCD1602_Print(12,0,"pros");
- motor_stop();//電機停止
- delay1ms(1);
- motor_foreward(); //電機正轉
- }
- }
- if(f_key==0) //反轉鍵
- {
- delay1ms(50);
- if(f_key==0)
- {
- beep_alarm(); //蜂鳴器報警
- Rotation_f=1; //步進電機旋轉狀態標志 為0正轉 1反轉
- LCD1602_Print(12,0,"cons");
- motor_stop();//電機停止
- delay1ms(1);
- motor_reversal(); //電機反轉
- }
- }
- if(run_key==0) //啟動/停止鍵
- {
- delay1ms(50);
- if(run_key==0)
- {
- beep_alarm(); //蜂鳴器報警
- power_flag=~power_flag; //總開關標志
- if(power_flag==1)
- {
- if(Rotation_f==0) //步進電機旋轉狀態標志 為0正轉 1反轉
- {
- motor_stop();//電機停止
- delay1ms(1);
- motor_foreward(); //電機正轉
- }
- else
- {
- motor_stop();//電機停止
- delay1ms(1);
- motor_reversal(); //電機反轉
- }
- }
- else motor_stop(); //電機停止
- while(!run_key);//等待按鍵釋放
- }
- }
- }
- /*************************************************/
- /**********************主函數*********************/
- void main()
- {
- PWM_duty=50; //PWM占空比
- timer_init(); //定時器初始化程序
- EX1=1;
- IT1=1;
- LCD1602_init(); //LCD1602液晶初始化
- LCD1602_Print(0,0,"V: 0rpm pros");
- LCD1602_Print(0,1,"PWM_duty: 0 ");
- dis_duty(); //顯示占空比
- while(1)
- {
- key_check(); //按鍵處理程序
- if(dis_speed_flag==1)
- {
- dis_speed(); //顯示轉速
- dis_speed_flag=0;
- }
- }
- }
- /**************************************************/
復制代碼
0.png (40.52 KB, 下載次數: 53)
下載附件
2019-1-5 01:22 上傳
全部資料51hei下載地址:
PWM直流電機調速顯示轉速.7z
(11.63 MB, 下載次數: 462)
2019-1-5 01:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|