STM32——PWM

#define TIMER4_PWM_GRP      GPIOB
#define TIMER4_PWM_INDEX1    GPIO_Pin_7
#define TIMER4_PWM_INDEX2    GPIO_Pin_6
#define TIMER4_PWM_LOW(grp, index) GPIO_ResetBits(grp, index)
#define TIMER4_PWM_HIGH(grp, index) GPIO_SetBits(grp, index)
#define TIMER4_PWM_CONFIG(grp, index, mode) GPIOConfig(grp, index, mode)
#ifndef _BSP_PWM_H_
#define _BSP_PWM_H_

#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
#include "type.h"

void PwmTimerSet(GPIO_TypeDef* gpio, uint16_t pin, TIM_TypeDef* timer, uint8_t channel,
                 uint32_t freq, uint32_t duty);

#endif /* _BSP_PWM_H_ */
#include "pwm.h"
//#include "target.h"

void pwm_gpio_init(GPIO_TypeDef* gpio, uint16_t pin, GPIOMode_TypeDef mode)
{
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  if(mode == GPIO_Mode_AF_PP)
  {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  }
  TIMER4_PWM_CONFIG(gpio, pin, mode);
}

// set freq(Hz) and duty(1/10000); if duty = 2000--- 2000/10000 = 20%
// PwmTimerSet(TIMER4_PWM_GRP, TIMER4_PWM_INDEX1, PWM_TIMER4, 1, 10000, 5000);
void PwmTimerSet(GPIO_TypeDef* gpio, uint16_t pin, TIM_TypeDef* timer, uint8_t channel,
                 uint32_t freq, uint32_t duty)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;

  uint16_t period, prescal;
  uint32_t clk;

  if(10000 == duty) // 100%
  {
    TimerDisable(timer);
	pwm_gpio_init(gpio, pin, GPIO_Mode_Out_PP);
	TIMER4_PWM_LOW(gpio, pin);

	return;
  }

  pwm_gpio_init(gpio, pin, GPIO_Mode_AF_PP);

  clk = SystemCoreClock; // 72 * 10^6;

  if(freq < 100)
  {
    prescal = 100 - 1;
    period = (clk / 10000) / freq - 1;
  }
  else if(freq < 3000)
  {
    prescal = 100 - 1;
    period = (clk / 100) / freq - 1;
  }
  else
  {
    prescal = 0;
    period = clk / freq - 1;
  }

  TIM_TimeBaseStructure.TIM_Period = period;
  TIM_TimeBaseStructure.TIM_Prescaler = prescal;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(timer, &TIM_TimeBaseStructure);

  TIM_OCStructInit(&TIM_OCInitStructure);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = (duty * period) / 10000;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  if(1 == channel)
  {
    TIM_OC1Init(timer, &TIM_OCInitStructure);
    TIM_OC1PreloadConfig(timer, TIM_OCPreload_Enable);
  }
  else if(2 == channel)
  {
    TIM_OC2Init(timer, &TIM_OCInitStructure);
    TIM_OC2PreloadConfig(timer, TIM_OCPreload_Enable);
  }
  TIM_ARRPreloadConfig(timer, ENABLE);

  /* TIMx enable counter */
  TIM_Cmd(timer, ENABLE);
}



舵机驱动是STM32的一种应用方式,通过使用PWM输出信号来控制舵机的转动角度。PWM(脉冲宽度调制)是一种通过改变脉冲信号的高电平时间来控制电机或舵机的转动角度的技术。在STM32中,可以使用定时器模块来生成PWM信号,并通过改变占空比来控制舵机的位置。 具体来说,舵机驱动需要以下几个步骤: 1. 配置定时器:选择一个合适的定时器,并配置其工作模式和时钟源。 2. 配置输出通道:选择一个定时器的输出通道,并配置其工作模式为PWM输出模式。 3. 设置PWM周期:根据舵机的要求,设置定时器的重载值,确定PWM信号的周期。 4. 设置占空比:通过改变定时器的比较值,可以改变PWM信号的占空比,从而控制舵机的转动角度。 5. 启动定时器:使能定时器开始生成PWM信号。 通过以上步骤,可以实现对舵机的驱动控制。具体的代码实现可以参考引用\[3\]中的学习记录文章,其中详细介绍了如何在STM32中使用PWM输出来驱动舵机。 #### 引用[.reference_title] - *1* *2* *3* [总结篇:STM32舵机、电机的驱动&OSBoat电路逻辑的梳理](https://blog.youkuaiyun.com/weixin_47723114/article/details/127727386)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值