stm32电机控制之控制两路直流电机

发布时间:2022-12-21  

  小车使用的电机是12v供电的直流电机,带编码器反馈,这样就可以采用闭环速度控制,这里电机使用PWM驱动,速度控制框图如下:

  由以上框图可知,STM32通过定时器模块输出PWM波来控制两个直流电机的转动,通过改变PWM占空比的大小可以改变电机的转速,由于我们的控制目标是实现电机运行在速度范围内任意给定的速度,这里就需要采用闭环控制的思想,通过编码器获取电机的实时转速,通过与给定速度做差,将偏差作为PID控制器的输入,通过PID控制改变PWM占空比的大小,从而使电机的速度运行在给定的速度上。


  这里使用的电机驱动芯片为TB6612,该芯片可以十分方便的驱动两个直流电机的运行,其驱动逻辑表如下:


  AIN1,AIN2的不同组合可以实现电机的正反转和停车,PWMA为PWM的输入引脚,通过输入不同的占空比可以改变电机转速的快慢。BIN1,BIN2,PWMB是控制另一路电机的引脚。


  首先我们需要利用STM32的定时器模块输出两路PWM波,这是使电机转起来的第一步。初始化PWM:


  //初始化PWM引脚

  void motorPWMPin_init(void)

  {

  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_11  ;//TIM1_Chn_1,TIM1_Chn_2

  GPIO_Init(GPIOE,&GPIO_InitStructure);

  GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_TIM1);

  GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_TIM1);

  }

  //初始化PWM

  void motorPWM_init(void)

  {

  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrecture;

  TIM_OCInitTypeDef TIM_OCInitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

  TIM_TimeBaseInitStrecture.TIM_Period = 400;/*PWM's frequency is 20KHz*/

  TIM_TimeBaseInitStrecture.TIM_Prescaler =21-1;//将TIM1的时钟频率设定为8MHz

  TIM_TimeBaseInitStrecture.TIM_ClockDivision = TIM_CKD_DIV1;

  TIM_TimeBaseInitStrecture.TIM_CounterMode =  TIM_CounterMode_Up;//定时器向上计数

  TIM_TimeBaseInitStrecture.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStrecture);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ;

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;

  TIM_OC1Init(TIM1,&TIM_OCInitStructure);

  TIM_OC2Init(TIM1,&TIM_OCInitStructure);

  // TIM_Cmd(TIM1,ENABLE);

  TIM_CtrlPWMOutputs(TIM1,ENABLE);

  }

  然后初始化电机控制引脚,程序如下:


  //初始化电机控制引脚

  void motorCtrlPin_init(void)

  {

  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);

  //PE7,PE8控制电机A,PE9,PE10控制电机B

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_10;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;

  GPIO_Init(GPIOE, &GPIO_InitStructure);

  }

  需要注意的是设置PWM输出引脚时要讲引脚复用到定时器TIM1,而电机控制引脚只需要设置成简单的推挽输出模式即可。


  接着我们需要使用两个定时器的编码器功能用于读取电机的实时转动速度,这里我使用的是定时器3和定时器4.


  这里的编码器是精度较低的霍尔感应式编码器,但是基本满足控制精度的要求,驱动代码如下:


  void encoderA_init(void)

  {

  GPIO_InitTypeDef GPIO_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  TIM_ICInitTypeDef TIM_ICInitStructure;

  /*CLOCK Enable*/

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //PC6,PC7

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用引脚模式

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz

  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //无上下拉

  /*Configure PC6,PC7 as encoder A,B Input*/

  GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM3);

  GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_TIM3);

  GPIO_Init(GPIOC,&GPIO_InitStructure); //initialize PORTC

  /* Timer configuration in Encoder mode */

  /* Enable the TIM3 Update Interrupt */

  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority =0x01;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

  TIM_TimeBaseStructure.TIM_Prescaler = 0; //不分频

  TIM_TimeBaseStructure.TIM_Period = 65535; //设置为最大

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ; //向上计数

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,  TIM_ICPolarity_Rising , TIM_ICPolarity_Rising );//上升沿计数

  TIM_ICStructInit(&TIM_ICInitStructure);

  TIM_ICInitStructure.TIM_ICFilter = 10;//设置滤波系数

  TIM_ICInit(TIM3, &TIM_ICInitStructure);

  TIM_ClearFlag(TIM3, TIM_FLAG_Update); //清除更新中断

  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //使能更新中断

  TIM3->CNT = 0;//将计数值设为0

  TIM_Cmd(TIM3, ENABLE);//enable TIM3

  printf("Encoder_A initializztion is OKn");

  }


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    —扩展输入模块、EY——扩展输出模块。 04R代表继电器型输出。除了R还有T--晶体管输出、S--晶闸管输出。其中常用的是MR和MT这两种型号的PLC。 MR继电器型输出的特点,能控制交流电和直流电,并且控制直流......
    )内提供 48 KB 内存,用于驱动颇具成本效益的继电器控制直流电机应用全球微电子工程公司 Melexis 今日宣布推出面向继电器控制直流电机应用的全新 LIN 预驱动芯片 MLX81160。该芯......
    显示屏,显示转速和其他操作信息。 电源:使用24V直流电源作为系统的电源。 (3)软件设计 采用C语言编写单片机程序进行控制。 实现PWM技术控制直流电机的转速。通过调整占空比来改变输出电压,从而达到控制直流电机......
    的正反转。 二、单片机控制电机的方式 1. 直流电机控制方式 直流电机是一种既可以作为发电机使用,也可以作为驱动器使用的电机。当单片机与直流电机相连时,可以采用软件PWM控制直流电机......
    直流电机调速器与变频调速器的区别;直流电机调速器多使用于控制直流电机的场合中,而变频器则多数使用于控制交流电机。 一般在大功率(50KW以上)的生产施工场合采用直流电机的优势是直流电机......
    无刷直流马达控制电路;无刷直流电机(BLDC)是一种高效、高可靠性、低噪声和低维护成本的电机,由于其优异的性能,在许多应用中得到了广泛的应用,例如家用电器、工业自动化、电动车等。控制BLDC电机需要一个专门的控制......
    如何控制电机的转速 电机速度太快怎么减速;  如何控制电机的转速   控制直流电机的转速通常可以通过控制电机的输入电压或者改变电机的机械负载来实现。   控制电机的输入电压控制电机的输入电压可以通过控制......
    以前,晶闸管都没有诞生的时候,还是通过发电机来带动直流电机进行调速的,调整发电机励磁电流就可以控制发电机的输出电压,从而控制直流电机的转速,这种调速系统可以在早期的《电机拖动》教科书上见到,只是......
    母线电压不可调等几种。 4、直流驱动器 控制直流电机,在一些特殊项目中或者一些改造项目中可能会遇到。 其基本参数有两个:电枢......
    器,用于控制直流电动机的运行。其工作原理是通过改变输入的直流电压和电流来改变电机的转速和转向。这种电机控制器适用于电动工具、电动车、机器人等领域。3. 步进电机控制器原理步进电机控制器用于控制步进电机......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>