單片機直流無刷電機的轉速,與上位機通訊
2、電路原理圖與PCB圖,用Altium Designer Winter09軟件打開;
3、程序代碼,用keil軟件打開;
4、上位機顯示,用軟件visual studio 2012打開;
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
單片機源程序如下:
- #include <STC12C5A.h>
- #include "LCD1602.h"
- #include "keys.h"
- void PWM_Init();
- void SendOneByte(unsigned char byte);
- void InitUART(void);
- void InitTimer1(void);
- void InitTimer0(void);
- unsigned char Time1_Key_Con=0;
- unsigned char Speed_Change=0;
- unsigned int Time1_Speed_Con=0;
- unsigned int Speed_Value=0;
- unsigned int Speed_Set=2400;
- unsigned char View_Speed_Data[7]="3000RPM";
- unsigned char View_Set_Data[7]="3000RPM";
- sbit MOTOR_CW=P1^5;//正反轉控制引腳
- unsigned char CW_Con=0;
- sbit MOTOR_STOP=P1^4; //停止控制引腳
- unsigned char STOP_Con=1;
- unsigned int Send_Con=0;
- unsigned char Send_Change=0;
- void main()
- {
- InitLcd(); //初始化液晶
- InitUART();
- InitTimer1();
- PWM_Init();
- InitTimer0();
- Key_Second_Function_Run=Key_Value_3|Key_Value_4; //設定按鍵為快速改變功能
- CCAP0H=128; //設定占空比暫為50%
- Lcd_1602_word(0x80,16,"START ");
- Lcd_1602_word(0xc0,16,"Z 2400RPM");
- while(1)
- {
- if(Send_Change)
- {
- Send_Change=0;
- SendOneByte(0xaa);
- if(CW_Con==0)
- SendOneByte(0x02);
- else
- SendOneByte(0x01);
- SendOneByte(Speed_Value/256);
- SendOneByte(Speed_Value%256);
- }
- if(Key_Change) //按鍵處理程序
- {
- Key_Change=0;
- switch(Key_Value)
- {
- case 1:
- {
- if(CW_Con) //改變電機的正轉和反轉
- {
- CW_Con=0;
- MOTOR_CW=1;
- Lcd_1602_word(0x80,5,"START");//顯示正轉
- }
- else
- {
- CW_Con=1;
- MOTOR_CW=0;
- Lcd_1602_word(0x80,5,"STOP "); //顯示反轉
- }
- break;
- }
- case 2:
- {
- if(STOP_Con)
- {
- STOP_Con=0;
- MOTOR_STOP=STOP_Con;
- Lcd_1602_word(0xc0,2,"F ");//顯示停止
- }
- else
- {
- STOP_Con=1;
- MOTOR_STOP=STOP_Con;
- Lcd_1602_word(0xc0,2,"Z " );//顯示開始
- }
- break;
- }
- case 3:
- {
- if(Speed_Set<4800) //設定電機的轉速設定
- {
- Speed_Set=Speed_Set+100;
- }
- break;
- }
- case 4:
- {
- if(Speed_Set>100)
- {
- Speed_Set=Speed_Set-100;
- }
- break;
- }
- }
- View_Set_Data[0]=Speed_Set/1000+0x30;
- View_Set_Data[1]=Speed_Set%1000/100+0x30;
- View_Set_Data[2]=Speed_Set%100/10+0x30;
- View_Set_Data[3]=Speed_Set%10+0x30;
- if(View_Set_Data[0]==0x30)
- {
- View_Set_Data[0]=' ';
- if(View_Set_Data[1]==0x30)
- {
- View_Set_Data[1]=' ';
- if(View_Set_Data[2]==0x30)
- View_Set_Data[2]=' ';
- }
- }
- Lcd_1602_word(0xc9,7,View_Set_Data); //顯示電機的設定轉速
- }
- if(Speed_Change==1) //計算電機的轉速
- {
- Speed_Value=TH0;
- Speed_Value=Speed_Value<<8;
- Speed_Value+=TL0;
- Speed_Value=Speed_Value*96; //得到每分鐘的轉速
- View_Speed_Data[0]=Speed_Value/1000+0x30;
- View_Speed_Data[1]=Speed_Value%1000/100+0x30;
- View_Speed_Data[2]=Speed_Value%100/10+0x30;
- View_Speed_Data[3]=Speed_Value%10+0x30;
- if(View_Speed_Data[0]==0x30)
- {
- View_Speed_Data[0]=' ';
- if(View_Speed_Data[1]==0x30)
- {
- View_Speed_Data[1]=' ';
- if(View_Speed_Data[2]==0x30)
- View_Speed_Data[2]=' ';
- }
- }
- Lcd_1602_word(0x89,7,View_Speed_Data);
- if(Speed_Value>Speed_Set) //根據電機的轉速,調劑占空比
- {
- if(((Speed_Value-Speed_Set)>30)&&STOP_Con)
- {
- if(((Speed_Value-Speed_Set)>250))
- {
- if(CCAP0H<20)
- {
- CCAP0H=10;
- }
- else
- {
- CCAP0H=CCAP0H-5; //減少占空比,提高轉速
- }
- }
- else
- {
- if(CCAP0H>10&&Speed_Set!=4800)
- CCAP0H--;
- }
- }
- }
- else
- {
- if(((Speed_Set-Speed_Value)>30)&&STOP_Con)
- {
- if((Speed_Set-Speed_Value)>250)
- {
- if(CCAP0H>=245)
- {
- CCAP0H=255;
- }
- else
- {
- CCAP0H=CCAP0H+5; //降低占空比,降低轉速
- }
- }
- else
- {
- if(CCAP0H<255)
- CCAP0H++;
- }
- }
- }
- Speed_Change=0;
- InitTimer0();
- }
- }
- }
- void Timer0Interrupt(void) interrupt 1
- {
-
- }
- void InitTimer0(void)
- {
- TMOD |= 0x05;
- TH0 = 0x00;
- TL0 = 0x00;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void InitTimer1(void)
- {
- TMOD |= 0x10;
- TH1 = 0xFC;
- TL1 = 0x18;
- EA = 1;
- ET1 = 1;
- TR1 = 1;
- }
- void Timer1Interrupt(void) interrupt 3
- {
- TH1 = 0xFC;
- TL1 = 0x18;
- Send_Con++;
- if(Send_Con==500)
- {
- Send_Con=0;
- Send_Change=1;
- }
- if(Speed_Change==0)
- Time1_Speed_Con++;
- if(Time1_Speed_Con==100)
- {
- TR0 = 0;
- Time1_Speed_Con=0;
- Speed_Change=1;
- }
- Time1_Key_Con++;
- if(Time1_Key_Con==10)
- {
- Time1_Key_Con=0;
- Key_Acquisition();
- }
- }
- void PWM_Init() //pwm初始化
- {
- CCON = 0; //Initial PCA control register
- CL = 0; //Reset PCA base timer
- CH = 0;
- CMOD = 0x02; //Set PCA timer clock source as Fosc/2
- CCAP0H = CCAP0L = 0xff; //PWM0 port output 50% duty cycle square wave
- CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt
- CR = 1; //PCA timer start run //PCA timer start run
- }
- void InitUART(void) //串口初始化設定
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位數據,可變波特率
- AUXR &= 0xFB; //獨立波特率發生器時鐘為Fosc/12,即12T
- BRT = 0xFD; //設定獨立波特率發生器重裝值
- AUXR |= 0x01; //串口1選擇獨立波特率發生器為波特率發生器
- AUXR |= 0x10; //啟動獨立波特率發生器
- }
- void SendOneByte(unsigned char byte) //串口一個字符發送函數
- {
- TI = 0;
- SBUF = byte;
- while(!TI);
- TI = 0;
- }
復制代碼
所有資料51hei提供下載:
無刷電機調速.7z
(2.5 MB, 下載次數: 195)
2019-6-27 01:24 上傳
點擊文件名下載附件
|