STM32之PWM控制电机

PWM的原理:

假定定时器工作在向上计数 PWM 模式,且当 CNT=CCRx 时输出 1。那么就可以得到如上的 PWM 示意图:当 CNT 值小于 CCRx 的时候,IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候, IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。 改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的 频率,这就是 PWM 输出的原理
 

PWM参数计算公式:

1.)pwm频率:72M/(PSC+1)/(ARR+1)

2.)  pwm占空比:CCR/(ARR+1)

3.)pwm分辨率:1/(ARR+1)

直接上代码:

    //开启时钟线
	RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2,ENABLE);
	//开启GPIO
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

    //配置定时器的ARR和PSC
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=arr;
	TIM_TimeBaseInitStruct.TIM_Prescaler=psc;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);

    TIM_OCInitTypeDef  TIM_OCInitStruct;
    TIM_OCStructInit(&TIM_OCInitStruct);
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_Pulse=ccr;
	TIM_OC1Init(TIM2,&TIM_OCInitStruct);

    //使能TIM2
	TIM_Cmd(TIM2, ENABLE);

接着,控制电机的正反转:

void set_motor(int moto1,int moto2)
{
    	if(moto1>0)
            {AIN2=0,AIN1=1};
			else 
            {AIN2=1,AIN1=0};
			
		if(moto2>0)	
            {BIN1=0,BIN2=1};
			else
            {BIN1=1,BIN2=0};
			
    //限幅
    int MAX=6900; 

    if(Moto1<-MAX) Moto1=-MAX;	
	if(Moto1>MAX)  Moto1=MAX;	
	if(Moto2<-MAX) Moto2=-MAX;	
	if(Moto2>MAX)  Moto2=MAX;	
}

有需要的话还是自己写一个绝对值函数!!!!

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F4系列微控制器拥有强大的PWM功能,可以用来控制电机的转速。下面是一个简单的示例来说明如何使用STM32F4的PWM模块来控制电机转速。 首先,我们需要在STM32CubeMX中配置PWM定时器和输出通道。我们选择一个定时器,比如TIM2,并设置它为PWM模式。然后我们需要选择一个输出通道,比如CH1。我们可以设置定时器的频率和分辨率,以及占空比的范围。 接下来,我们需要编写代码来控制PWM输出。首先,我们需要初始化定时器和输出通道,并设置合适的频率和分辨率。然后,我们可以使用一个变量来控制占空比,从而控制电机转速。比如,我们可以使用一个0到100之间的变量来表示占空比的百分比。 然后,我们需要编写一个循环,在循环中更新占空比,并将其传递给PWM输出通道。通过改变占空比,我们可以改变PWM信号的高电平时间,从而控制电机的转速。 最后,我们需要连接电机PWM输出通道。我们可以使用一个MOSFET或者电机驱动芯片来连接电机和定时器的输出引脚。通过改变PWM信号的占空比,我们可以改变驱动器的通断时间,从而改变电机的转速。 当我们运行代码时,电机应该开始旋转。通过改变占空比的值,我们可以改变电机的转速。较高的占空比将产生更长的高电平脉冲,使电机转速更快。较低的占空比将产生更短的高电平脉冲,使电机转速更慢。 总而言之,使用STM32F4的PWM功能,我们可以轻松地控制电机的转速。只需配置定时器和输出通道,并通过改变占空比来控制PWM信号的高电平时间,就可以实现对电机转速的精确控制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值