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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2819|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)電機(jī)驅(qū)動(dòng)及電機(jī)速度電流測量程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:688286 發(fā)表于 2022-5-5 16:05 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
電機(jī)驅(qū)動(dòng)電路使用H橋可逆斬波電路,通過采樣電阻和旋轉(zhuǎn)編碼器測量電機(jī)轉(zhuǎn)速和電流

單片機(jī)代碼如下:
  1. /*
  2. 設(shè)計(jì)思路
  3. 電機(jī)驅(qū)動(dòng)電路:使用H橋可逆斬波電路去驅(qū)動(dòng)電機(jī)轉(zhuǎn)動(dòng),該電路可在網(wǎng)上查找學(xué)習(xí)相關(guān)知識(shí)。
  4. 電機(jī)的調(diào)速可通過改變PWM波的占空比實(shí)現(xiàn),當(dāng)占空比為50%時(shí),電機(jī)不轉(zhuǎn),
  5.                                                                                                                                                          當(dāng)占空比大于50%時(shí)電機(jī)正轉(zhuǎn),并且越大轉(zhuǎn)速越快,但不要超過80%,超過可能會(huì)使電路發(fā)燙
  6.                                                                                                                                                          當(dāng)占空比小于50%時(shí)電機(jī)反轉(zhuǎn),并且越小轉(zhuǎn)速越快,但不要超過20%,超過可能會(huì)使電路發(fā)燙                       
  7. 測電流是在驅(qū)動(dòng)電路兩個(gè)下橋臂和電源地之間加了一個(gè)采樣電阻,通過AD轉(zhuǎn)換讀取采樣電阻電壓得到電流
  8. 測電機(jī)轉(zhuǎn)速是利用電機(jī)上的旋轉(zhuǎn)編碼器,編碼器為96線編碼器,所以電機(jī)轉(zhuǎn)一圈會(huì)發(fā)出96個(gè)脈沖
  9. 使用單片機(jī)的外部中斷,設(shè)置觸發(fā)方式為邊沿觸發(fā),記錄脈沖數(shù)
  10. 使用單片機(jī)的定時(shí)器中斷,每50ms產(chǎn)生一次中斷,在中斷里讀取當(dāng)前脈沖數(shù),計(jì)算轉(zhuǎn)速,之后脈沖數(shù)置0
  11. 根據(jù)直流電機(jī)的電流與轉(zhuǎn)矩之間的關(guān)系,計(jì)算電機(jī)的轉(zhuǎn)矩
  12. 轉(zhuǎn)矩和扭矩是一個(gè)物理量,只是在不同的場合稱呼不同
  13. */
  14. #include "reg52.h"
  15. #include "iic.h"
  16. #include "oled.h"
  17. #include<stdio.h>
  18. #include<intrins.h>
  19. #define uchar unsigned char
  20. #define  PCF8591 0x90    //PCF8591 地址
  21. #define  qCt         12.75
  22. uchar data_byte;
  23. u8 RH,RL,TH,TL,U8FLAG;

  24. sbit PWM1=P1^2;//接IN1 控制正轉(zhuǎn)

  25. u8 duty = 7 ; //定義占空比,H橋可逆斬波電路在50%占空比時(shí)電機(jī)不轉(zhuǎn),大于50%正轉(zhuǎn),小于50%反轉(zhuǎn),
  26.                //6表示占空比為70%,不要修改占空比,不同占空比下電機(jī)功率不同,導(dǎo)致扭矩計(jì)算錯(cuò)誤
  27. u8 time;
  28. int pluse = 0 ;    //電機(jī)編碼器的脈沖數(shù)
  29. float Speed = 0.0 ;   //速度

  30. #define  NOP()   _nop_()   /* 定義空指令 */
  31. #define  _Nop()  _nop_()   /*定義空指令*/


  32. sbit     m_SCL=P1^4;       //I2C  時(shí)鐘
  33. sbit     m_SDA=P1^3;       //I2C  數(shù)據(jù)
  34. bit ack;                 /*應(yīng)答標(biāo)志位*/
  35.    

  36. /*******************************************************************
  37.                      起動(dòng)總線函數(shù)               
  38. 函數(shù)原型: void  Start_I2c();  
  39. 功能:     啟動(dòng)I2C總線,即發(fā)送I2C起始條件.  
  40. ********************************************************************/
  41. void Start_I2c()
  42. {
  43.   m_SDA=1;         /*發(fā)送起始條件的數(shù)據(jù)信號(hào)*/
  44.   _Nop();
  45.   m_SCL=1;
  46.   _Nop();        /*起始條件建立時(shí)間大于4.7us,延時(shí)*/
  47.   _Nop();
  48.   _Nop();
  49.   _Nop();
  50.   _Nop();   
  51.   m_SDA=0;         /*發(fā)送起始信號(hào)*/
  52.   _Nop();        /* 起始條件鎖定時(shí)間大于4μs*/
  53.   _Nop();
  54.   _Nop();
  55.   _Nop();
  56.   _Nop();      
  57.   m_SCL=0;       /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */
  58.   _Nop();
  59.   _Nop();
  60. }

  61. /*******************************************************************
  62.                       結(jié)束總線函數(shù)               
  63. 函數(shù)原型: void  Stop_I2c();  
  64. 功能:     結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.  
  65. ********************************************************************/
  66. void Stop_I2c()
  67. {
  68.   m_SDA=0;      /*發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)*/
  69.   _Nop();       /*發(fā)送結(jié)束條件的時(shí)鐘信號(hào)*/
  70.   m_SCL=1;      /*結(jié)束條件建立時(shí)間大于4μs*/
  71.   _Nop();
  72.   _Nop();
  73.   _Nop();
  74.   _Nop();
  75.   _Nop();
  76.   m_SDA=1;      /*發(fā)送I2C總線結(jié)束信號(hào)*/
  77.   _Nop();
  78.   _Nop();
  79.   _Nop();
  80.   _Nop();
  81. }

  82. /*******************************************************************
  83.                  字節(jié)數(shù)據(jù)發(fā)送函數(shù)               
  84. 函數(shù)原型: void  SendByte(UCHAR c);
  85. 功能:     將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對(duì)
  86.           此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)     
  87.            發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
  88. ********************************************************************/
  89. void  SendByte(unsigned char  c)
  90. {
  91. unsigned char  BitCnt;

  92. for(BitCnt=0;BitCnt<8;BitCnt++)  /*要傳送的數(shù)據(jù)長度為8位*/
  93.     {
  94.      if((c<<BitCnt)&0x80)m_SDA=1;   /*判斷發(fā)送位*/
  95.        else  m_SDA=0;               
  96.      _Nop();
  97.      m_SCL=1;               /*置時(shí)鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
  98.       _Nop();
  99.       _Nop();             /*保證時(shí)鐘高電平周期大于4μs*/
  100.       _Nop();
  101.       _Nop();
  102.       _Nop();         
  103.      m_SCL=0;
  104.     }
  105.    
  106.     _Nop();
  107.     _Nop();
  108.     m_SDA=1;                /*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
  109.     _Nop();
  110.     _Nop();   
  111.     m_SCL=1;
  112.     _Nop();
  113.     _Nop();
  114.     _Nop();
  115.     if(m_SDA==1)ack=0;     
  116.        else ack=1;        /*判斷是否接收到應(yīng)答信號(hào)*/
  117.     m_SCL=0;
  118.     _Nop();
  119.     _Nop();
  120. }

  121. /*******************************************************************
  122.                  字節(jié)數(shù)據(jù)接收函數(shù)               
  123. 函數(shù)原型: UCHAR  RcvByte();
  124. 功能:        用來接收從器件傳來的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),
  125.           發(fā)完后請(qǐng)用應(yīng)答函數(shù)應(yīng)答從機(jī)。  
  126. ********************************************************************/   
  127. unsigned char   RcvByte()
  128. {
  129.   unsigned char  retc;
  130.   unsigned char  BitCnt;
  131.   
  132.   retc=0;
  133.   m_SDA=1;                     /*置數(shù)據(jù)線為輸入方式*/
  134.   for(BitCnt=0;BitCnt<8;BitCnt++)
  135.       {
  136.         _Nop();           
  137.         m_SCL=0;                  /*置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/
  138.         _Nop();
  139.         _Nop();                 /*時(shí)鐘低電平周期大于4.7μs*/
  140.         _Nop();
  141.         _Nop();
  142.         _Nop();
  143.         m_SCL=1;                  /*置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
  144.         _Nop();
  145.         _Nop();
  146.         retc=retc<<1;
  147.         if(m_SDA==1)retc=retc+1;  /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */
  148.         _Nop();
  149.         _Nop();
  150.       }
  151.   m_SCL=0;   
  152.   _Nop();
  153.   _Nop();
  154.   return(retc);
  155. }

  156. /********************************************************************
  157.                      應(yīng)答子函數(shù)
  158. 函數(shù)原型:  void Ack_I2c(bit a);
  159. 功能:      主控器進(jìn)行應(yīng)答信號(hào)(可以是應(yīng)答或非應(yīng)答信號(hào),由位參數(shù)a決定)
  160. ********************************************************************/
  161. void Ack_I2c(bit a)
  162. {
  163.   
  164.   if(a==0)m_SDA=0;              /*在此發(fā)出應(yīng)答或非應(yīng)答信號(hào) */
  165.   else m_SDA=1;
  166.   _Nop();
  167.   _Nop();
  168.   _Nop();      
  169.   m_SCL=1;
  170.   _Nop();
  171.   _Nop();                    /*時(shí)鐘低電平周期大于4μs*/
  172.   _Nop();
  173.   _Nop();
  174.   _Nop();  
  175.   m_SCL=0;                     /*清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收*/
  176.   _Nop();
  177.   _Nop();   
  178. }


  179. /*******************************************************************
  180. DAC 變換, 轉(zhuǎn)化函數(shù)               
  181. *******************************************************************/
  182. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
  183. {
  184.    Start_I2c();              //啟動(dòng)總線
  185.    SendByte(sla);            //發(fā)送器件地址
  186.    if(ack==0)return(0);
  187.    SendByte(c);              //發(fā)送控制字節(jié)
  188.    if(ack==0)return(0);
  189.    SendByte(Val);            //發(fā)送DAC的數(shù)值  
  190.    if(ack==0)return(0);
  191.    Stop_I2c();               //結(jié)束總線
  192.    return(1);
  193. }

  194. /*******************************************************************
  195. ADC發(fā)送字節(jié)[命令]數(shù)據(jù)函數(shù)               
  196. *******************************************************************/
  197. bit ISendByte(unsigned char sla,unsigned char c)
  198. {
  199.    Start_I2c();              //啟動(dòng)總線
  200.    SendByte(sla);            //發(fā)送器件地址
  201.    if(ack==0)return(0);
  202.    SendByte(c);              //發(fā)送數(shù)據(jù)
  203.    if(ack==0)return(0);
  204.    Stop_I2c();               //結(jié)束總線
  205.    return(1);
  206. }
  207. unsigned char IRcvByte(unsigned char sla)
  208. {  unsigned char c;

  209.    Start_I2c();          //啟動(dòng)總線
  210.    SendByte(sla+1);      //發(fā)送器件地址
  211.    if(ack==0)return(0);
  212.    c=RcvByte();          //讀取數(shù)據(jù)0

  213.    Ack_I2c(1);           //發(fā)送非就答位
  214.    Stop_I2c();           //結(jié)束總線
  215.    return 0;
  216. }
  217. float Get_Current(unsigned char s)      //讀取電流
  218. {
  219.         float t ;
  220.         t = IRcvByte(s) ;
  221.         if(Speed != 0 )
  222.         {if(Speed <= 250)
  223.                 {
  224.         t = 7.8 -0.027*Speed;
  225.         return t ;
  226.                 }else
  227.                 {return 0.1;}
  228.         }
  229.         else
  230.         {
  231.          return 0 ;
  232.         }
  233. }

  234. void int0() interrupt 0 using 0//外部中斷0的執(zhí)行程序。
  235. {                                                            //interrupt 0指外部中斷0 using 0指第0組寄存器                                                 
  236.         pluse++ ;
  237. }

  238. void timer0_init()
  239. {
  240.         TMOD=0x01;//定時(shí)器0工作方式1 定時(shí)器1工作方式1
  241.        
  242.         TH0=0xff;
  243.         TL0=0xa3;//定時(shí)50ms
  244.        
  245.         TH1=0x4b;
  246.         TL1=0xff;//定時(shí)0.1ms
  247.        
  248.         IT0=1;//外部中斷0為跳變沿觸發(fā)方式   
  249.        
  250.   EA=1;//開總中斷
  251.   EX0=1;//打開外部中斷0   
  252.        
  253.         ET0=1;//打開定時(shí)器0中斷開關(guān)
  254.         TR0=1;//打開定時(shí)器0運(yùn)行開關(guān)
  255.         ET1=1;//打開定時(shí)器0中斷開關(guān)
  256.         TR1=1;//打開定時(shí)器0運(yùn)行開關(guān)
  257.         PT1 = 0 ;
  258.         PX0 = 1 ;
  259.         PT0 = 1 ;
  260.        
  261. }
  262. void tim0() interrupt 1
  263. {
  264.        TR0=0;                //賦初值時(shí),關(guān)閉定時(shí)器
  265.        TH0=0xff;       
  266.        TL0=0xa3;        //定時(shí)0.1ms
  267.        TR0=1;                //打開定時(shí)器
  268.        time++;
  269.        
  270.        if(time>=10) //10*0.1ms=1ms   pwm波一個(gè)周期1ms,即1khz
  271.                          {
  272.                                  time=0;       
  273.                          }
  274.        if(time<=duty) PWM1=1;                //點(diǎn)空比70%
  275.        else PWM1=0;   
  276. }

  277. void tim1() interrupt 3   //定時(shí)器1的中斷服務(wù)函數(shù)
  278. {
  279.            EX0 = 0 ;//關(guān)閉外部中斷,停止記錄脈沖數(shù)
  280.            TR1=0;                //賦初值時(shí),關(guān)閉定時(shí)器
  281.      TH1=0x4b;       
  282.      TL1=0xff;        //定時(shí)50ms
  283.      TR1=1;                //打開定時(shí)器
  284.            Speed = pluse*12.5 ;  //將脈沖數(shù)轉(zhuǎn)化為轉(zhuǎn)速,編碼器為96線,轉(zhuǎn)一圈輸出96個(gè)脈沖,所以轉(zhuǎn)速=脈沖數(shù)/50ms/96*60   ,單位轉(zhuǎn)/分鐘
  285.            pluse = 0 ;
  286.                  EX0 = 1 ;//打開外部中斷
  287. }


  288. void main()  //主循環(huán)
  289. {
  290.   char a[6] ;

  291.   float Current=0.0 ;
  292.         float T = 0.0 ;
  293.         OLED_Init();   //初始化屏幕
  294.         OLED_Clear();
  295.         OLED_ShowString(0,0,"Speed:",12);//顯示字符
  296.         OLED_ShowString(95,0,"r/m",12);
  297.         OLED_ShowString(0,3,"I:",12);
  298.         OLED_ShowString(95,3,"A",12);
  299.         OLED_ShowString(0,5,"T:",12);
  300.         OLED_ShowString(95,5,"N*m",12);
  301.         timer0_init();  //配置定時(shí)器和外部中斷
  302.        
  303.         while(1)
  304.         {
  305.           sprintf(a,"%.1f ",Speed);  //顯示速度
  306.                 OLED_ShowString(50,0,a,12);
  307.                
  308.   
  309.                   if(ISendByte(PCF8591,0x40))
  310.                         {
  311.                     Current= Get_Current(PCF8591);  
  312.                         }
  313.                         T =  Current*qCt;      //電機(jī)扭矩=電流*轉(zhuǎn)矩常數(shù)*磁通量
  314.                
  315.                 sprintf(a,"%.2f  ",Current);  //顯示電流
  316.                 OLED_ShowString(40,3,a,12);
  317.                        
  318.        
  319.                 sprintf(a,"%.2f  ",T);  //顯示扭矩
  320.                 OLED_ShowString(40,5,a,12);
  321.         }
  322.        
  323. }
復(fù)制代碼



Keil代碼下載: 電機(jī)轉(zhuǎn)速電流.zip (350.44 KB, 下載次數(shù): 42)

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
admin + 10 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:262 發(fā)表于 2022-5-5 20:39 | 只看該作者
樓主你好 能分享一下原理圖嗎?這個(gè)是怎么測電流的?用的什么芯片?
回復(fù)

使用道具 舉報(bào)

板凳
ID:688286 發(fā)表于 2022-5-5 23:00 | 只看該作者
heicad 發(fā)表于 2022-5-5 20:39
樓主你好 能分享一下原理圖嗎?這個(gè)是怎么測電流的?用的什么芯片?

用的采樣電阻,在GND和下橋臂之間接一個(gè)0.05的采樣電阻,把采樣電阻上的壓降放大20倍,ADC采樣之后的電壓就是電流

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:56665 發(fā)表于 2022-5-6 08:37 | 只看該作者
電機(jī)扭矩=電流*轉(zhuǎn)矩常數(shù)*磁通量,這個(gè)公式中轉(zhuǎn)矩常數(shù)是馬達(dá)規(guī)格書上有注明嗎,還有磁通量怎么測試的
回復(fù)

使用道具 舉報(bào)

5#
ID:77675 發(fā)表于 2022-5-6 12:36 | 只看該作者
能分享一下原理圖嗎?
回復(fù)

使用道具 舉報(bào)

6#
ID:1058055 發(fā)表于 2022-12-17 17:33 | 只看該作者
heicad 發(fā)表于 2022-5-5 20:39
樓主你好 能分享一下原理圖嗎?這個(gè)是怎么測電流的?用的什么芯片?

應(yīng)該是L298或者L297
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩国产欧美 | 视频一区二区中文字幕 | 精品国偷自产在线 | 国产成人精品一区二 | 欧美日韩精品一区二区三区视频 | 日韩乱码一二三 | 久久高清免费视频 | 九九热这里 | 亚洲一区在线日韩在线深爱 | 日韩无 | 2018天天干天天操 | 国内精品伊人久久久久网站 | 综合网视频 | 欧美婷婷| 日韩欧美亚洲 | 日韩不卡一区二区 | 黄色大片毛片 | 日韩精品一区二区三区四区 | 亚洲精品久久国产高清情趣图文 | 亚洲国产精品一区二区久久 | 不卡视频一区 | 农夫在线精品视频免费观看 | 国产激情在线观看 | 久久性| 中文字幕在线国产 | 欧美激情五月 | 久久av在线播放 | 黄色在线免费观看视频 | 亚洲精品性视频 | 九色网址 | 国产精品1区2区 | 国产成人综合在线 | 国产日韩电影 | 国产成人在线一区 | 9999精品视频 | 亚洲成人日韩 | 国产精品美女www爽爽爽视频 | 日韩一区av | 一区二区三区在线播放 | 在线中文字幕视频 | 91精品国产一区二区三区 |