本帖最后由 聪聪哥哥 于 2025-8-29 17:57 编辑
一:PWM知识分享:
PWM(Pulse Width Modulation 脉宽调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。它是一种对模拟信号电平进行数字编码的方法。是指在一定时间内波形的高电平(即 1 状态)所占用的时间比例。通过高分辨率计数器的使用,方波占空比被调制用来对一个模拟信号的电平进行编码。PWM 信号任然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有,要么完全无。比如我们的电压输出是 5V的,那么经过改变 PWM 的占空比,可以达到在一定时间内输出 3.3V 或者 1.3V 的效果。
PWM是脉冲宽度调制,具有两个非常重要的参数:频率和占空比。
频率:PWM的频率是整个周期的倒数。
占空比:占空比是指一个周期内高电平所占的比例。
二:软件流程编写如下所示:
使能定时器和相关IO口时钟。
使能定时器5时钟:RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR5);
使能GPIOA时钟:RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
l初始化IO口为复用功能输出。
这里我们是要把PA1用作定时器的PWM输出引脚,所以要重映射配置,
l所以需要开启AFIO时钟。同时设置重映射。
l初始化定时器:Prescaler,Period等:
l使能定时器,设置PWM开始输出功能
三:软件编写如下所示:
- void TMR5_Config(void)
- {
- TMR_BaseConfig_T tmrBaseConfig;
- TMR_OCConfig_T tmrOCConfig;
- GPIO_Config_T gpioConfig;
- RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR5);
- RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.mode = GPIO_MODE_AF_PP;
- gpioConfig.pin = GPIO_PIN_1;
- GPIO_Config(GPIOA, &gpioConfig);
- /* TMR5 clock source frequency = 120MHz */
- tmrBaseConfig.countMode = TMR_COUNTER_MODE_UP;
- tmrBaseConfig.clockDivision = TMR_CLOCK_DIV_1;
- tmrBaseConfig.period = 999;
- tmrBaseConfig.division = 59;
- tmrBaseConfig.repetitionCounter = 0;
- TMR_ConfigTimeBase(TMR5, &tmrBaseConfig);
- /* 50% PWM */
- tmrOCConfig.mode = TMR_OC_MODE_PWM1;
- tmrOCConfig.outputState = TMR_OC_STATE_ENABLE;
- tmrOCConfig.outputNState = TMR_OC_NSTATE_DISABLE;
- tmrOCConfig.polarity = TMR_OC_POLARITY_HIGH;
- tmrOCConfig.nPolarity = TMR_OC_NPOLARITY_HIGH;
- tmrOCConfig.idleState = TMR_OC_IDLE_STATE_RESET;
- tmrOCConfig.nIdleState = TMR_OC_NIDLE_STATE_RESET;
- tmrOCConfig.pulse = 500;
- TMR_ConfigOC2(TMR5, &tmrOCConfig);
- TMR_EnablePWMOutputs(TMR5);
- TMR_Enable(TMR5);
- }
四:实物测试图片如下所示:
如图所示:控制器输出2K,占空比为 50%的固定频率。
五:拓展延伸如下所示:
5.1 : 输出可变的脉冲频率如下:
- void UpdataFre(int data)
- {
- int k ;
- k= 2000000 /data ;
- TMR_BaseConfig_T tmrBaseConfig;
- TMR_OCConfig_T tmrOCConfig;
- tmrBaseConfig.period = k;
- TMR_ConfigTimeBase(TMR5, &tmrBaseConfig);
- tmrOCConfig.pulse = k / 2;
- TMR_ConfigOC2(TMR5, &tmrOCConfig);
- }
5.2 输出不同占空比如下:
- void UpdataDuty(int data)
- {
- TMR_BaseConfig_T tmrBaseConfig;
- TMR_OCConfig_T tmrOCConfig;
- tmrBaseConfig.period = 999;
- TMR_ConfigTimeBase(TMR5, &tmrBaseConfig);
- tmrOCConfig.pulse = data / 100 *1000;
- TMR_ConfigOC2(TMR5, &tmrOCConfig);
- }
|