找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8789|回复: 4
打印 上一主题 下一主题
收起左侧

单片机控制无刷电机调速电路+源程序+C#上位机

[复制链接]
跳转到指定楼层
楼主
单片机直流无刷电机的转速,与上位机通讯
2、电路原理图与PCB图,用Altium Designer Winter09软件打开;
3、程序代码,用keil软件打开;
4、上位机显示,用软件visual studio 2012打开;
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include <STC12C5A.h>
  2. #include "LCD1602.h"
  3. #include "keys.h"

  4. void PWM_Init();
  5. void SendOneByte(unsigned char byte);
  6. void InitUART(void);
  7. void InitTimer1(void);
  8. void InitTimer0(void);

  9. unsigned char Time1_Key_Con=0;
  10. unsigned char Speed_Change=0;
  11. unsigned int  Time1_Speed_Con=0;
  12. unsigned int  Speed_Value=0;

  13. unsigned int  Speed_Set=2400;
  14. unsigned char View_Speed_Data[7]="3000RPM";
  15. unsigned char View_Set_Data[7]="3000RPM";

  16. sbit MOTOR_CW=P1^5;//正反转控制引脚
  17. unsigned char CW_Con=0;

  18. sbit MOTOR_STOP=P1^4;        //停止控制引脚
  19. unsigned char STOP_Con=1;

  20. unsigned int  Send_Con=0;
  21. unsigned char Send_Change=0;

  22. void main()
  23. {
  24.         InitLcd();         //初始化液晶
  25.         InitUART();
  26.         InitTimer1();
  27.         PWM_Init();
  28.         InitTimer0();
  29.         Key_Second_Function_Run=Key_Value_3|Key_Value_4;   //设定按键为快速改变功能
  30.         CCAP0H=128;                        //设定占空比暂为50%
  31.         Lcd_1602_word(0x80,16,"START           ");
  32.         Lcd_1602_word(0xc0,16,"Z        2400RPM");
  33.         while(1)
  34.         {
  35.                 if(Send_Change)
  36.                 {
  37.                         Send_Change=0;
  38.                         SendOneByte(0xaa);
  39.                         if(CW_Con==0)
  40.                                 SendOneByte(0x02);
  41.                         else
  42.                                 SendOneByte(0x01);
  43.                         SendOneByte(Speed_Value/256);
  44.                         SendOneByte(Speed_Value%256);
  45.                 }
  46.                 if(Key_Change)                                                //按键处理程序
  47.                 {
  48.                         Key_Change=0;
  49.                         switch(Key_Value)
  50.                         {
  51.                                 case 1:
  52.                                 {
  53.                                         if(CW_Con)                  //改变电机的正转和反转
  54.                                         {
  55.                                                 CW_Con=0;
  56.                                                 MOTOR_CW=1;
  57.                                                 Lcd_1602_word(0x80,5,"START");//显示正转
  58.                                         }
  59.                                         else
  60.                                         {
  61.                                                 CW_Con=1;
  62.                                                 MOTOR_CW=0;
  63.                                                 Lcd_1602_word(0x80,5,"STOP ");        //显示反转
  64.                                         }
  65.                                         break;        
  66.                                 }
  67.                                 case 2:
  68.                                 {
  69.                                         if(STOP_Con)
  70.                                         {
  71.                                                 STOP_Con=0;
  72.                                                 MOTOR_STOP=STOP_Con;
  73.                                                 Lcd_1602_word(0xc0,2,"F ");//显示停止
  74.                                         }
  75.                                         else
  76.                                         {
  77.                                                 STOP_Con=1;
  78.                                                 MOTOR_STOP=STOP_Con;
  79.                                                 Lcd_1602_word(0xc0,2,"Z " );//显示开始
  80.                                         }
  81.                                         break;
  82.                                 }
  83.                                 case 3:
  84.                                 {
  85.                                         if(Speed_Set<4800)                //设定电机的转速设定
  86.                                         {
  87.                                                 Speed_Set=Speed_Set+100;
  88.                                         }
  89.                                         break;
  90.                                 }
  91.                                 case 4:
  92.                                 {
  93.                                         if(Speed_Set>100)
  94.                                         {
  95.                                                 Speed_Set=Speed_Set-100;
  96.                                         }
  97.                                         break;
  98.                                 }
  99.                         }
  100.                         View_Set_Data[0]=Speed_Set/1000+0x30;
  101.                         View_Set_Data[1]=Speed_Set%1000/100+0x30;
  102.                         View_Set_Data[2]=Speed_Set%100/10+0x30;
  103.                         View_Set_Data[3]=Speed_Set%10+0x30;
  104.                         if(View_Set_Data[0]==0x30)
  105.                         {
  106.                                 View_Set_Data[0]=' ';
  107.                                 if(View_Set_Data[1]==0x30)
  108.                                 {
  109.                                         View_Set_Data[1]=' ';
  110.                                         if(View_Set_Data[2]==0x30)
  111.                                                 View_Set_Data[2]=' ';
  112.                                 }
  113.                         }
  114.                         Lcd_1602_word(0xc9,7,View_Set_Data); //显示电机的设定转速
  115.                 }
  116.                 if(Speed_Change==1)                 //计算电机的转速
  117.                 {
  118.                         Speed_Value=TH0;
  119.                            Speed_Value=Speed_Value<<8;
  120.                            Speed_Value+=TL0;
  121.                         Speed_Value=Speed_Value*96;        //得到每分钟的转速

  122.                         View_Speed_Data[0]=Speed_Value/1000+0x30;
  123.                         View_Speed_Data[1]=Speed_Value%1000/100+0x30;
  124.                         View_Speed_Data[2]=Speed_Value%100/10+0x30;
  125.                         View_Speed_Data[3]=Speed_Value%10+0x30;
  126.                         if(View_Speed_Data[0]==0x30)
  127.                         {
  128.                                 View_Speed_Data[0]=' ';
  129.                                 if(View_Speed_Data[1]==0x30)
  130.                                 {
  131.                                         View_Speed_Data[1]=' ';
  132.                                         if(View_Speed_Data[2]==0x30)
  133.                                                 View_Speed_Data[2]=' ';
  134.                                 }
  135.                         }
  136.                         Lcd_1602_word(0x89,7,View_Speed_Data);
  137.                         if(Speed_Value>Speed_Set)                //根据电机的转速,调剂占空比
  138.                         {
  139.                                 if(((Speed_Value-Speed_Set)>30)&&STOP_Con)
  140.                                 {
  141.                                         if(((Speed_Value-Speed_Set)>250))
  142.                                         {
  143.                                                 if(CCAP0H<20)
  144.                                                 {
  145.                                                         CCAP0H=10;
  146.                                                 }
  147.                                                 else
  148.                                                 {
  149.                                                         CCAP0H=CCAP0H-5;         //减少占空比,提高转速
  150.                                                 }
  151.                                         }
  152.                                         else
  153.                                         {
  154.                                                 if(CCAP0H>10&&Speed_Set!=4800)
  155.                                                         CCAP0H--;
  156.                                         }
  157.                                 }
  158.                         }
  159.                         else
  160.                         {
  161.                                 if(((Speed_Set-Speed_Value)>30)&&STOP_Con)
  162.                                 {
  163.                                         if((Speed_Set-Speed_Value)>250)
  164.                                         {
  165.                                                 if(CCAP0H>=245)
  166.                                                 {
  167.                                                         CCAP0H=255;        
  168.                                                 }
  169.                                                 else
  170.                                                 {
  171.                                                         CCAP0H=CCAP0H+5;  //降低占空比,降低转速
  172.                                                 }
  173.                                         }
  174.                                         else
  175.                                         {
  176.                                                 if(CCAP0H<255)
  177.                                                         CCAP0H++;
  178.                                         }
  179.                                 }
  180.                         }
  181.                         Speed_Change=0;
  182.                         InitTimer0();
  183.                 }               
  184.         }
  185. }

  186. void Timer0Interrupt(void) interrupt 1
  187. {
  188.    
  189. }

  190. void InitTimer0(void)
  191. {
  192.     TMOD |= 0x05;
  193.     TH0 = 0x00;
  194.     TL0 = 0x00;
  195.     EA = 1;
  196.     ET0 = 1;
  197.     TR0 = 1;
  198. }

  199. void InitTimer1(void)
  200. {
  201.     TMOD |= 0x10;
  202.     TH1 = 0xFC;
  203.     TL1 = 0x18;
  204.     EA = 1;
  205.     ET1 = 1;
  206.     TR1 = 1;
  207. }

  208. void Timer1Interrupt(void) interrupt 3
  209. {
  210.         TH1 = 0xFC;
  211.     TL1 = 0x18;
  212.         Send_Con++;
  213.         if(Send_Con==500)
  214.         {
  215.                 Send_Con=0;
  216.                 Send_Change=1;
  217.         }
  218.         if(Speed_Change==0)
  219.             Time1_Speed_Con++;
  220.         if(Time1_Speed_Con==100)
  221.         {
  222.                 TR0 = 0;
  223.                 Time1_Speed_Con=0;
  224.                 Speed_Change=1;
  225.         }
  226.         Time1_Key_Con++;
  227.         if(Time1_Key_Con==10)
  228.         {
  229.                 Time1_Key_Con=0;
  230.                 Key_Acquisition();
  231.         }
  232. }

  233. void PWM_Init()                 //pwm初始化
  234. {
  235.     CCON = 0;                       //Initial PCA control register
  236.     CL = 0;                         //Reset PCA base timer
  237.     CH = 0;
  238.     CMOD = 0x02;                    //Set PCA timer clock source as Fosc/2                           
  239.     CCAP0H = CCAP0L = 0xff;         //PWM0 port output 50% duty cycle square wave
  240.     CCAPM0 = 0x42;                  //PCA module-0 work in 8-bit PWM mode and no PCA interrupt
  241.     CR = 1;                         //PCA timer start run                        //PCA timer start run
  242. }



  243. void InitUART(void)         //串口初始化设定
  244. {
  245.     PCON &= 0x7F;                //波特率不倍速
  246.         SCON = 0x50;                //8位数据,可变波特率
  247.         AUXR &= 0xFB;                //独立波特率发生器时钟为Fosc/12,即12T
  248.         BRT = 0xFD;                //设定独立波特率发生器重装值
  249.         AUXR |= 0x01;                //串口1选择独立波特率发生器为波特率发生器
  250.         AUXR |= 0x10;                //启动独立波特率发生器
  251. }

  252. void SendOneByte(unsigned char byte)  //串口一个字符发送函数
  253. {
  254.     TI = 0;
  255.         SBUF = byte;
  256.         while(!TI);
  257.         TI = 0;
  258. }
复制代码

所有资料51hei提供下载:
无刷电机调速.7z (2.5 MB, 下载次数: 195)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:563624 发表于 2019-9-24 22:40 | 只看该作者
请问是如何通过外部电路进行调速的,例如把手等控制装置
回复

使用道具 举报

板凳
ID:267435 发表于 2019-9-26 10:30 | 只看该作者
pascal116 发表于 2019-9-24 22:40
请问是如何通过外部电路进行调速的,例如把手等控制装置

模拟采样啊
回复

使用道具 举报

地板
ID:617033 发表于 2019-9-27 09:52 | 只看该作者
有教程吗
回复

使用道具 举报

5#
ID:72951 发表于 2020-3-16 09:47 | 只看该作者
学习了,很不错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表