你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F407ZGT6控制电机

[复制链接]
STMCU小助手 发布时间:2021-8-13 13:55
大概思路
1.利用定时器产生可控方波(选好定时器及通道),需要注意的是设置PWM输出引脚时要将引脚复用到定时器
2.将电机控制引脚设置成推挽输出模式
3.改变占空比即可改变速度
4.采用的电机驱动为TB6612,这里不做介绍
5.我这里用的是定时器1的通道1,2,3,4。可自行修改
1.png


定时器初始化
定时器1初始化
  1. <font face="微软雅黑" size="3">void TIM1_PWM_Init(u32 arr,u32 psc)
  2. {
  3.         //此部分需手动修改IO口设置
  4.         int ccr1=500,ccr2=500,ccr3=500,ccr4=500;
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  7.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  8.        
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);          //TIM1时钟使能
  10.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);         //使能时钟
  11.        
  12.         GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_TIM1);
  13.         GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_TIM1);
  14.         GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_TIM1); //GPIOE9,E11,E13,E14复用为定时器1
  15.         GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_TIM1);
  16.        
  17.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_14;           //GPIOF9
  18.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
  19.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //速度100MHz
  20.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
  21.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
  22.         GPIO_Init(GPIOE,&GPIO_InitStructure);              //初始化IO口
  23.           
  24.         TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
  25.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  26.         TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
  27.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  28.        
  29.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  30.        
  31.         TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//初始化定时器1
  32.        

  33.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  34.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  35. ///**************
  36.   TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//输出同相
  37.                 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  38.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  39.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High;


  40.   TIM_OCInitStructure.TIM_Pulse = ccr1;
  41.         TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  42.        
  43.         TIM_OCInitStructure.TIM_Pulse = ccr2;
  44.         TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  45.   
  46.   
  47.         TIM_OCInitStructure.TIM_Pulse = ccr3;
  48.         TIM_OC3Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 OCx

  49.    TIM_OCInitStructure.TIM_Pulse = ccr4; //设置待装入捕获比较寄存器的脉冲值
  50.         TIM_OC4Init(TIM1, &TIM_OCInitStructure);

  51.         TIM_Cmd(TIM1, ENABLE);
  52. TIM_CtrlPWMOutputs(TIM1,ENABLE);
  53. }
  54. </font>
复制代码


高级定时器与通用定时器异同
1.采用定时器产生可控方波,高级定时器TIM1、TIM8与通用定时器配置有所不同,比通用定时器多两行代码:


下面展示一些 内联代码片。
  1. <font face="微软雅黑" size="3">TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//重复计数器的值
  2. TIM_CtrlPWMOutputs(TIM1,ENABLE);//主输出使能,当使用的是通用定时器时,这句不需要</font>
复制代码


电机IO口初始化
IO设置为推挽输出即可
我这里用的IO为D0,D1,D2,D3,D10,D11,B14,B15
(4个电机,8个IO)
  1. <font face="微软雅黑" size="3">void MOTOR_GPIO_Config(void)  电机控制对应IO口
  2. {
  3.         /*定义一个GPIO_InitTypeDef类型的结构体*/
  4.         GPIO_InitTypeDef GPIO_InitStructure;

  5.         /*开启GPIOB的外设时钟*/
  6.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

  7.         /*选择要控制的引脚*/
  8.     // 4个电机 ,8个IO口       
  9.           GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_10|GPIO_Pin_11;       

  10.         /*设置引脚模式为通用推挽输出*/
  11.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   

  12.         /*设置引脚速率为50MHz*/   
  13.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  14.         /*调用库函数,初始化*/                  
  15.                   GPIO_Init(GPIOD, &GPIO_InitStructure);                 
  16.        
  17.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  18.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_14|GPIO_Pin_15;
  19.           GPIO_Init(GPIOB, &GPIO_InitStructure);

  20.         GPIO_SetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_10|GPIO_Pin_11);
  21.   GPIO_SetBits(GPIOB,GPIO_Pin_14|GPIO_Pin_15);
  22. }
  23. </font>
复制代码


改变占空比调速
调用函数改变占空比即可改变调速
  1. <font face="微软雅黑" size="3">TIM_SetCompareN(TIMx, Compare2)</font>
复制代码
N为定时器哪个通道,x为定时器几,Compare2为自己设置的数值


总结
控制电机、舵机这一类模块电源最好跟其它模块电源分开,不然对其它模块工作会有影响。(比如循迹模块啥的)。控制原理已知,具体效果看实际,需进行多次试验。

收藏 评论0 发布时间:2021-8-13 13:55

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版