stm32f103输出PWM波

PWM波介绍

pwm波是定时器输出比较模块的具体实现, 由软件控制GPIO口的模拟高低电平的转换, 也可以实现, 但是占用太多CPU资源, 产生的pwm波不稳定, 所以由硬件电路来实现.

具体可以做的用途: 控制电机的速度, 角度. 呼吸灯, 无源蜂鸣器, 等等多种场合.

PWM波的三大参数

频率  Freq =  时钟源频率 / (PSC+1) / (ARR+1);   也是定时器溢出频率

分辨率 Reso = 1 / (ARR+1);   配置重装值的大小, 0-ARR的值一个一个往上加, 所以是分辨率.

占空比 Duty = CCR / (ARR+1);  与CCR比较, 0-CCR为有效值.

逻辑实现

  1.  开启RCC外设时钟(TIM, GPIO)
  2.  选择定时器时钟通道
  3. 配置GPIO(复用输出模式)
  4. 配置Timer Base单元
  5. 配置输出比较单元
  6. 启动定时器

输出比较模式

代码实现

 实现1khz, 分辨率1%, 占空比50%.

void generalTimer2PWMInit()
{
    //配置RCC
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    //选择时基单元的时钟源
    TIM_InternalClockConfig(TIM2);
    
    //配置GPIO
    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);
    
    //配置时基单元, 1khz, 分辨率100
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
    TIM_TimeBaseInitStructure.TIM_Period = 100-1;//ARR自动重装值
    TIM_TimeBaseInitStructure.TIM_Prescaler = 720-1;//PSC预分频器值
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值(高级定时器才有)
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    
    //配置输出比较单元
    TIM_OCInitTypeDef TIM_OCInitStruct;
    TIM_OCStructInit(&TIM_OCInitStruct);
    TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //pwm1模式,CCR>CNT有效
    TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //有效电平是高电平
    TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//输出使能
    TIM_OCInitStruct.TIM_Pulse = 50; //CCR
    TIM_OC1Init(TIM2, &TIM_OCInitStruct);
    
    TIM_Cmd(TIM2, ENABLE);
}

 逻辑分析仪效果如下, 成功.

 设置CCR占空比为20%, 效果如下.

 TIM_SetCompare1(TIM2, 20);

STM32单片机上生成PWM来控制舵机转动90度的过程主要包括以下几个步骤: 1. **初始化GPIO和TIM**: - 首先需要配置GPIO作为PWM输出口,如PA8或PB6等。通过`GPIO_Init()`函数设置GPIO的工作模式为推挽输出,并将其速度设为最高频率。 - 初始化定时器TIM,比如TIM2或TIM3,选择适合的通道(例如Channel 1)并设置计数器的工作模式为PWM。 2. **配置PWM周期和占空比**: - 根据舵机的工作特性(典型的是4096步或50%的占空比对应180度),确定一个合适的PWM周期(周期=总周期/最大脉冲数)。然后计算出90度对应的占空比,通常是75%左右。 - 使用`TIM_TimeBaseInit()`函数设置TIM的周期和预分频器,以便得到所需的PWM频率和周期。 3. **设置PWM模式**: - 设置TIM的工作模式为PWM模式,通过`TIM_SelectOutputTrigger()`设置输出触发源为边缘对齐(例如 TIM_OCR1Edge)。 4. **启用PWM输出**: - 开启TIM的计数器和更新事件,以及外部中断请求。 5. **设置初始和目标值**: - 调整开始时的占空比(即低电平持续时间),通常舵机静止时占空比为0。然后逐渐增加占空比到90度的目标值。 6. **循环调整占空比**: - 在主循环中不断读取TIM的当前值,并调整占空比以逼近目标值。当达到设定的90度时停止调整。 ```c while (!舵机到达90度) { uint16_t current_duty_cycle = calculate_current_dutyCycle(当前角度); TIM_SetCompare1(TIMx, current_duty_cycle); TIM_Cmd(TIMx, ENABLE); // 更新占空比 } // 当达到90度时,关闭PWM输出 TIM_Cmd(TIMx, DISABLE); ``` 其中`calculate_current_dutyCycle(angle)`是一个辅助函数,根据给定的角度计算相应的占空比。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值