久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8959|回復: 4
收起左側

單片機控制無刷電機調速電路+源程序+C#上位機

[復制鏈接]
ID:571820 發表于 2019-6-26 10:02 | 顯示全部樓層 |閱讀模式
單片機直流無刷電機的轉速,與上位機通訊
2、電路原理圖與PCB圖,用Altium Designer Winter09軟件打開;
3、程序代碼,用keil軟件打開;
4、上位機顯示,用軟件visual studio 2012打開;
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png 0.png 0.png 0.png

單片機源程序如下:
  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 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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 | 顯示全部樓層
有教程嗎
回復

使用道具 舉報

ID:72951 發表于 2020-3-16 09:47 | 顯示全部樓層
學習了,很不錯
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 婷婷午夜天 | 日韩精品福利 | 日韩不卡视频在线 | 中文字幕1区2区3区 日韩在线视频免费观看 | 欧美在线天堂 | 成人在线中文字幕 | 天堂一区二区三区 | 国产成人精品一区二区三 | 自拍 亚洲 欧美 老师 丝袜 | 亚洲一区二区三区 | 人干人人 | 在线久草| 亚洲国产成人精品在线 | www.亚洲视频.com| 国产视频一区二区 | 久久在线视频 | 日韩av福利在线观看 | 日本a∨视频 | 亚洲欧美国产精品久久 | 久久成人精品一区二区三区 | 欧美日韩亚洲一区 | 99热热| 国产精品久久片 | 日韩中文字幕网 | 久久成人精品 | 国产一区二区三区四区在线观看 | 国产精品视频导航 | 精久久久| 午夜精 | 日韩精品在线看 | 国产午夜精品一区二区三区在线观看 | 免费黄色av网站 | 久久精品天堂 | 国产精品18久久久久久久 | 日韩一区二区在线视频 | 日日干日日射 | 久久天堂网 | 国产精久久久 | 91免费版在线 | 欧美日韩精品一区二区三区四区 | 在线视频h|