单片机直流无刷电机的转速,与上位机通讯
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)
|