基于STM32单片机的DC减速电机控制程序设计
- 发布日期:2024-11-19 06:36 点击次数:186
在DC减速电机的控制中,最常用的方法是通过脉宽调制来控制DC电机的速度。在控制小车直线行驶的过程中,有必要设置两者的转速(如果你想直线行驶,还需要保证两者的行程在短时间内大致相等,这可以通过PID算法来控制)。因此,当检测到两个车轮的转速不同时,有必要动态地调整一个或两个车轮的脉宽调制的点空间比(对于简单点,一个车轮用作参考,另一个车轮可被调整;如果采用固定标准,则需要调整两个车轮的脉宽调制占空比)。
1程序的第一步是稍微设置GPIO(输出脉宽调制的引脚仅是模式_自动频率_程序)2程序的第二步:设置定时器(确保生成两个脉宽调制电路,我使用TIM4)45 void TIM4_ConfiguraTIon(void)6 {7 TIM _时基初始化类型定义TIM _时基初始化结构;8 TIM _ OCinitTypeDef TIM _ OCinitstructure;910 //时基初始化11 TIM_TimeBaseInitStructure。时间周期= 144;//18K/144 = 125赫兹,这是电机的脉宽调制频率12 TIM_TimeBaseInitStructure。TIM _预分频器= 4000;//72000000/4000=18K13 TIM_TimeBaseInitStructure。TIM _ ClockDivision = TIM _ CKD _ DIV 1;14 TIM_TimeBaseInitStructure。TIM _计数器代码= TIM _计数器代码_ Up15 TIM_TimeBaseInitStructure。TIM _ reproduction counter = 0x 0000;1617 TIM _时基初始化(TIM4和TIM _时基初始化结构);1819//4个脉宽调制输出的输出比较模式设置20 TIM_OCInitStructure。TIM _ OCMode = TIM _ OCMode _ PWM2//输出脉宽调制21 TIM_OCInitStructure。TIM _输出状态= TIM _输出状态_启用;//启用前向信道22 TIM_OCInitStructure。TIM _ OutputState状态= TIM _ OutputState状态_禁用;//禁用反向信道23 TIM_OCInitStructure。脉冲=脉宽调制;//左轮方向的占空比24 TIM_OCInitStructure。TIM _ OCpolarity = TIM _ OCpolarity _ Low;//输出极性低25 TIM_OCInitStructure。TIM _ OCNpolarity = TIM _ OCpolarity _ High;//互补输出极性高26 TIM_OCInitStructure。TIM _ OCIdleState = TIM _ OCIdleState _ Set;27 TIM_OCInitStructure。TIM _ OCNIDDEstate = TIM _ OCNIDDEstate _ Reset;2829 TIM _ OC1 nit(TIM 4和TIM _ OC1 nit structure);//脉宽调制_ 1初始化30 TIM _预加载配置(TIM4,TIM _ OCpreload _ Disable);//更改点空间比后,效果将立即出现。3132 TIM_OCInitStructure。脉冲=脉宽调制;//左轮脉宽调制占空比33 TIM _ OC2 nit(TIM 4和TIM _ OC1 nitstructure);//脉宽调制_电阻初始化34 TIM _重载配置(TIM4,TIM _ OCPreload _ Disable);//更改点空间比后,效果将立即出现。3536 //定时器4使能37 TIM_Cmd(TIM4,ENABLE);38 TIM_CtrlPWMOutputs(TIM4,ENABLE);该程序的第一步是稍微设置GPIO(输出脉宽调制的引脚仅是模式_自动对焦_程序)程序的第二步是设置一个定时器(这足以确保产生两个脉宽调制电路,我使用TIM4)无效TIM4 _配置(无效){TIM _时基初始化类型定义TIM _时基初始化结构;TIM _ OCinitTypeDef TIM _ OCinitstructure;//时基初始化TIM_TimeBaseInitStructure。时间周期= 144;//18K/144 = 125赫兹,这是电机的脉宽调制频率TIM_TimeBaseInitStructure。TIM _预分频器= 4000;//72000000/4000=18KTIM_TimeBaseInitStructure。TIM _ ClockDivision = TIM _ CKD _ DIV 1;TIM_TimeBaseInitStructure。TIM _计数器代码= TIM _计数器代码_ UpTIM_TimeBaseInitStructure。TIM _ reproduction counter = 0x 0000;TIM _时基初始化(TIM4和TIM _时基初始化结构);//4路脉宽调制输出的输出比较模式设置TIM_OCInitStructure。TIM _ OCMode = TIM _ OCMode _ PWM2//输出脉宽调制TIM_OCInitStructure。TIM _输出状态= TIM _输出状态_启用;//启用前向信道TIM_OCInitStructure。TIM _ OutputState状态= TIM _ OutputState状态_禁用;//禁用反向信道TIM_OCInitStructure。脉冲=脉宽调制;//左轮方向的占空比TIM_OCInitStructure。TIM _ OCpolarity = TIM _ OCpolarity _ Low;//输出极性低TIM_OCInitStructure。TIM _ OCNpolarity = TIM _ OCpolarity _ High;//互补输出极性高TIM_OCInitStructure。TIM _ OCIdleState = TIM _ OCIdleState _ Set;TIM_OCInitStructure。TIM _ OCNIDDEstate = TIM _ OCNIDDEstate _ Reset;TIM _ OC1单位(TIM4和TIM _ OC1单位结构);//脉宽调制_ 1初始化TIM _ OC1预加载配置(TIM4,TIM _ OCpreload _ Disable);//更改点空间比后,效果将立即出现。TIM_OCInitStructure。脉冲=脉宽调制;//左轮脉宽调制占空比TIM _ OC2 nit(TIM 4 & TIM _ OCinitstructure);//脉宽调制_电阻初始化TIM _ OC2预加载配置(TIM4,TIM _ OCpreload _ Disable);//更改点空间比后, 亿配芯城 效果将立即出现。//使能定时器4TIM_Cmd(TIM4,ENABLE);TIM_CtrlPWMOutputs(TIM4,ENABLE);1程序步骤3:23在系统中断(SysTick interrupt)中,读取两个车轮的速度(具体方法是:每0.1秒读取一次,并将此人作为速度的基础),并进行比较,如果使用右车轮作为基础,则调整左车轮的脉宽调制占空比。所涉及的关键语句是:Tim _ setcompare 1();45 u16 COUN1 = 0;6 u16 COUN 2 = 0;78易失u16 Dist _ L = 0;//左轮冲程脉冲数9易失u16 Dist _ R = 0;//右轮冲程脉冲数10无效系统点击_处理程序(无效)11 {1213 COUN1=TIM1->”碳纳米管;//左轮在0.1秒内的脉冲数14 COUN2=TIM2-】碳纳米管;//0.1秒内右轮脉冲数15 Dist _ L = Dist _ L+COUN1;//左轮冲程脉冲数16 Dist _ R = Dist _ R+COUN 2;//右轮冲程脉冲数17 if((COUN 1-COUN 2)2)18 {19脉宽调制_ 1 = TIM _ GetCapture 1(TIM 4);20 TIM_SetCompare1(TIM4,脉宽调制_ L-4);21 }22其他if((COUN 2-COUN 1)2)23 {24脉宽调制_ 1 = TIM _ GetCapture 1(TIM 4);25 TIM_SetCompare1(TIM4,脉宽调制_ L+4);26 }2728 TIM_SetCounter(TIM1,0);29 TIM_SetCounter(TIM2,0);3031 }3233在Tim _ setcomparex上(;)这个函数有许多用途。另一个用途是产生不同频率的脉宽调制。具体程序如下:3435 u16捕获= 0;3637 extern vu16 CCR1 _ Val38 extern vu16 CCR2 _ Val39 extern vu16 CCR3 _ Val40 extern vu16 CCR4 _ Val4142 void TIM2_IRQHandler(void)43 {4445 /* TIM2_CH1切换频率= 183.1赫兹*/46 if(TIM _ GetTStatus(TIM 2,TIM_IT_CC1)!=复位)47 {48 TIM_ClearITPendingBit(TIM2,TIM _ IT _ CC1);49捕获= TIM _ GetCapture 1(TIM 2);50 TIM_SetCompare1(TIM2,capture+CCR 1 _ Val);51 }5253 /* TIM2_CH2切换频率= 366.2赫兹*/54 if(TIM _ Gettitstatus(TIM 2,TIM_IT_CC2)!=复位)55 {56蒂姆·克里特·彭丁比特(蒂姆·CC2);57捕获= TIM _ GetCapture 2(TIM 2);58 TIM_SetCompare2(TIM2,capture+CCR 2 _ Val);59 }6061 /* TIM2_CH3切换频率= 732.4赫兹*/62 if(TIM _ GetTStatus(TIM 2,TIM_IT_CC3)!=复位)63 {64 TIM_ClearITPendingBit(TIM2,TIM _ IT _ CC3);65捕获= TIM _ GetCapture 3(TIM 2);66 TIM_SetCompare3(TIM2,capture+CCR 3 _ Val);67 }6869 /* TIM2_CH4切换频率= 1464.8赫兹*/70 if(TIM _ GetTStatus(TIM 2,TIM_IT_CC4)!=复位)71 {72 TIM_ClearITPendingBit(TIM2,TIM _ IT _ CC4);73捕获= TIM _ GetCapture 4(TIM 2);74 TIM_SetCompare4(TIM2,capture+CCR 4 _ Val);75 }7677 }