PWM介绍
脉冲宽度调制(PWM),是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。即对脉冲宽度的控制。
STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出!
STM32F03C8T6 PWM资源:
高级定时器(TIM1):7路
通用定时器(TIM2—TIM4):各四路
PWM输出模式
- pwm输出模式1:在向上计数,一旦CNT<CCRx时输出有效电平,否侧为无效电平;向下计数时,一旦CNT>CCRx时输出为无效电平,否侧为有效电平
- pwm输出模式2:在向上计数,一旦CNT<CCRx时输出无效电平,否侧为有效电平;向下计数时,一旦CNT>CCRx时输出为有效电平,否侧为无效电平
- 有效电平(并非单指高电平或者低电平,需要看情况设定)
PWM周期与频率
周期与频率互为倒数
TimeOut = ((Prescaler + 1) * (Period + 1) ) / TimeClockFren;
解释下公式参数意义: TimeOut:定时器溢出时间(单位为us),多少触发(进入)一次TIM中断。
Prescaler:分频TIM时钟的预分频器值。
Period(ARR):计数重载值,TIM计数当超过这个值,则重新计数。
TimeClockFren:定时器的输入时钟频率(单位MHZ),也就是当前使用的TIM所用的CLOK的时钟频率。如果不清楚,可通过相关参数得到。
PWM实验
需求:使用pwm点亮led实现呼吸灯效果
问:led为什么可以越来越亮,越来越暗
答:这是由不同的占空比决定的 (占空比理解:占空比就是指在一个周期内,信号处于有效电平的时间占据整个信号周期的百分比)
问:如何计算周期/频率
答:假如频率为2khz,则PSC=71,ARR=499
问:led连接到哪个定时器的哪一路
答:从原理图看led连接到哪个IO口,在产品手册中搜索对于IO口查询
如下图
用CubeMX构建工程
1.修改debug
2.设置时钟
3.设置TIM4
主要设置这一块
关于TIM4设置的自动生成代码
启动PWM
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
修改比较值,修改占空比
__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,pwmVal);
int main(void)
{
/* USER CODE BEGIN 1 */
uint16_t pwmVal = 0;
uint8_t dir = 1;//改变方向:1越来越亮,0越来越暗
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM4_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
HAL_Delay(1);
if(dir){
pwmVal++;
}else {
pwmVal--;
}
if(pwmVal > 500){
dir = 0;
}
if(pwmVal == 0){
dir = 1;
}
__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,pwmVal);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}