找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+DRV8833直流电机驱动程序,霍尔传感器精确测速

[复制链接]
跳转到指定楼层
楼主
直流电机驱动程序,采用DRV8833驱动,并用霍尔传感器测量转速,测量精确



所有资料51hei提供下载:
直流电机驱动程序,采用DRV8833驱动,并用霍尔传感器测量转速,测量精确.zip (655.84 KB, 下载次数: 162)

msp430单片机源程序如下:
  1. /*
  2. * DC_Motor.c
  3. *
  4. *  Created on: 8-31
  5. *      Author: zdl
  6. */

  7. #include "global.h"

  8. //---------------------相关宏定义-------------------------
  9. #define ENCODE_NUM                4                                //测速码盘齿轮数目
  10. #define MAX_SPEED       340                                //最大转速(r/s)

  11. #define P_Coefficient   11                                //PID反馈中的比例系数
  12. #define I_Coefficient        2                                //PID反馈中的微分系数
  13. #define D_Coefficient        1                                //PID反馈中的积分系数

  14. //---------------------相关变量定义-----------------------
  15. static uint16_t         ui16Speed_Preset = 0;                //预设速度
  16. static uint16_t                ui16Speed_True = 0;                        //实测速度,单位XX转/分
  17.            uint16_t                ui16Speed_Measure = 0;                        //实测速度,单位XX转/分
  18. static uint16_t         ui16Speed_Pecent = 0;                //速度百分比,用于更新速度曲线
  19. uint16_t         ui16TA0_Overflow_Cnt = 0;        //定时器溢出计数
  20. uint16_t         ui16TA1_Overflow_Cnt = 0;        //定时器溢出计数
  21. static uint8_t         ui8FirstFlag = 1;                        //PID算法中微分项需要判断首次上电

  22. //---------------------局部函数声明---------------------
  23. static void Speed_Disp();
  24. static uint16_t PID_PWM(int16_t i16Error);
  25. static void Get_Fre();

  26. void DC_Motor_Graph()
  27. {
  28.         //-----Draw Title-----
  29.         GrClearDisplay(&g_sContext);
  30.         GrTaskRectDraw();

  31.         //-----绘制转速单位-----
  32.         GrStringDrawCentered(&g_sContext, "(r/s)", AUTO_STRING_LENGTH, 52, 20, OPAQUE_TEXT);

  33.         //-----绘制波形坐标轴-----

  34.         GrAxisDraw();
  35.         GrFlush(&g_sContext);
  36. }

  37. void DC_Motor_Begin()
  38. {
  39.         //--------GPIO Init--------
  40.         P2DIR &= ~BIT7;                                //-----测速中断IO初始化-----
  41.         P2IES |= BIT7;
  42.         P2IE  |= BIT7;

  43.         P1DIR |= BIT3 +BIT4;                //-----配置P1.3和P1.4电机PWM控制IO参数-----
  44.         P1OUT |= BIT3;
  45.         P1SEL |= BIT4;

  46.         //-----TA1 ContinuousMode Init-----
  47.         TIMER_A_configureContinuousMode(__MSP430_BASEADDRESS_T1A3__,//选择TA1定时器
  48.                                                                         TIMER_A_CLOCKSOURCE_SMCLK,
  49.                                                                         TIMER_A_CLOCKSOURCE_DIVIDER_1,
  50.                                                                         TIMER_A_TAIE_INTERRUPT_ENABLE,
  51.                                                                         TIMER_A_DO_CLEAR);
  52.         TA1CTL = TASSEL_2 + MC_2 + TACLR + TAIE; //启动测速
  53.         //-----TA0.3 PWM Init------
  54.         TIMER_A_generatePWM(  __MSP430_BASEADDRESS_T0A5__,//选择TA0定时器
  55.                                                                 TIMER_A_CLOCKSOURCE_SMCLK,
  56.                                                                 TIMER_A_CLOCKSOURCE_DIVIDER_1,
  57.                                                                 SYSMCLK/10000-1,                                                        //PWM 10K
  58.                                                            TIMER_A_CAPTURECOMPARE_REGISTER_3,
  59.                                                            TIMER_A_OUTPUTMODE_SET_RESET ,
  60.                                                            SYSMCLK/10000-1
  61.                                                                    );

  62.         //-----首次PID算法置标志位-----
  63.         ui8FirstFlag = 1;                                //PID算法中用于判断第一次的标志位
  64. }

  65. void DC_Motor_Main()
  66. {
  67.         Draw_Histogram(0);                                        //更新柱状图
  68.         Get_Fre();
  69.         Speed_Disp();                                                //更新预设与实测速度值
  70.         Draw_Waveform(&ui16Speed_Pecent,1); //更新速度曲线
  71.         GrFlush(&g_sContext);                                //刷新屏幕
  72.         LPM3;                                                                //执行函数由WDT定时唤醒
  73. }

  74. void DC_Motor_Quit()
  75. {
  76.         //-----GPIO Quit-----
  77.         P2DIR |= BIT7;
  78.         P2IE  &= ~BIT7;
  79.         P1SEL &= ~BIT4;
  80.         P1OUT &= ~(BIT3+BIT4);
  81.         ui8FirstFlag=1;

  82.         //-----TA0 Quit-----
  83.         TIMER_A_disableInterrupt(__MSP430_BASEADDRESS_T0A5__);

  84.         //-----TA1 Quit-----
  85.         TIMER_A_disableInterrupt(__MSP430_BASEADDRESS_T1A3__);
  86. }

  87. //-------------速度显示-------------
  88. static void Speed_Disp()
  89. {
  90.         //-----更新变量值-----
  91.         ui16Speed_Preset=MAX_SPEED*ui8Wheel_Pecent/100;
  92.         ui16Speed_Pecent=ui16Speed_True*100/MAX_SPEED;

  93.         //-----刷新显示-----
  94.         GrStringDrawCentered(&g_sContext, "     ",
  95.                         AUTO_STRING_LENGTH,20,20, OPAQUE_TEXT);                //清除前一次显示
  96.         GrStringNumberCentered(&g_sContext,
  97.                         ui16Speed_True,0,20,20);

  98.         GrStringDrawCentered(&g_sContext, "     ",
  99.                         AUTO_STRING_LENGTH,113,20, OPAQUE_TEXT);        //清除前一次显示
  100.         GrStringNumberCentered(&g_sContext,
  101.                         ui16Speed_Preset,0,113,20);
  102.         ui16Speed_True=0;
  103.         ui16Speed_Preset=0;
  104. }

  105. //----PID算法,计算出PWM占空比,8192等同100%占空比------
  106. static uint16_t PID_PWM(int16_t i16Error)
  107. {
  108.         static int16_t        i16Error_Prev = 0;
  109.         static int16_t        i16Integral = 0;
  110.         int16_t i16P_Component ,i16I_Component ,i16D_Component ;
  111.         int16_t i16Result;

  112.         if(ui8FirstFlag)                        //首次上电缺乏前次误差,补上。
  113.         {
  114.                 ui8FirstFlag = 0;
  115.                 i16Error_Prev = i16Error;
  116.                 i16Integral=0;
  117.         }

  118.         i16P_Component = P_Coefficient*i16Error;
  119.         i16I_Component = I_Coefficient*i16Integral;
  120.         i16D_Component = D_Coefficient*(i16Error-i16Error_Prev);
  121.         //-----误差积分-----
  122.         i16Integral += i16Error;
  123.         i16Result = i16P_Component + i16I_Component + i16D_Component;

  124.         //-----输出限幅----
  125.         if(i16Result > 8192)
  126.                 i16Result = 8192;
  127.         if(i16Result < 0)
  128.                 i16Result = 0;
  129.         return(i16Result);
  130. }

  131. /********************************************************
  132. *
  133. *                         以下函数需要放置在中断服务子函数中调用
  134. *
  135. ********************************************************/

  136. //-----WDT中断定时更新占空比-----
  137. void Change_PWM_Duty()
  138. {
  139.         int16_t i16Error = ui16Speed_Preset - ui16Speed_True;
  140.         uint32_t ui16PWM_Duty = PID_PWM(i16Error);
  141.         TA0CCR3 = (uint16_t)((ui16PWM_Duty)*TA0CCR0/8192);                //改变PWM占空比
  142. }

  143. //-----测量实际转速,此函数在P2中断中被调用-----
  144. static uint16_t ui16PreTemp=0;
  145. void Measure_Freq()
  146. {
  147.         uint32_t Speed_Sum;
  148.         uint16_t ui16Temp;

  149.         ui16Temp=TA1R;
  150.         Speed_Sum = (uint32_t)ui16Temp + (uint32_t)65536*ui16TA1_Overflow_Cnt-ui16PreTemp;//测速前的值减去测速后的计数值,那么就是在一段时间内计数的次数
  151.         ui16PreTemp = ui16Temp;
  152.         ui16TA1_Overflow_Cnt = 0;
  153.         ui16Speed_Measure = (uint16_t)( SYSMCLK / Speed_Sum);        //计算频率 , 开孔圆盘上有许多小孔,开孔圆盘旋转一周,光敏元件输出的电脉冲个数等于圆盘的开孔数,因此,可通过测量光敏元件输出的脉冲频率
  154. }

  155. //获取测量的速度,应该是获取转速
  156. static void Get_Fre()
  157. {
  158.         ui16Speed_True = ui16Speed_Measure/ENCODE_NUM; //返回实测转速值,除以齿轮数目
  159. }

复制代码




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

使用道具 举报

沙发
ID:135635 发表于 2020-3-26 13:45 | 只看该作者
谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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