之————03 PWM输出
时间:10-02
整理:3721RD
点击:
测试PWM输出,主要用于控制发热器功率。由于互补输出问题搞了好久,一直输不出信号。 一、实验项目
1.1 输出10HZ与100HZ的PWM信号。
1.2 通过KEY改变PWM的占空比与变频。
二、配置参数
2.1 通过原理图LD1是PA5 \LD2是PB7 \LD3是PB14 , 在对应的管脚上设置对应的输出。
2.2 设置HCLK时钟为16M,这样APB1与APB2 时钟就设置成了16MHz 
2.3设置对应定时器123

计算频率:要得到10HZ频率PWM信号,为方便按百分比输出(0-100),占空比设置成0-100.
设置时钟是16M=16000 000HZ频率比较高
Prescaler设置分频器为15999,
分频后的频率为=16000 000/(15999+1)=1000HZ.
counter period设置计数为99
1000HZ/(99+1)=10HZ(PWM频率)
pulse 设置占空比10(就是输出10%)

2.4设置好后导出文件并在开。
三、编程
3.1 main.c函数中开启定时器(TIM1 TIM3 TIM4)
/* USER CODE BEGIN 2 */
HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_2); //启动TIM1互补通道(注意启动互补型输出区别)
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2); //启动TIM4通道
/* USER CODE END 2 */
这样就LD1 LD2 LD3小灯都开始闪烁了。
3.2 stm32f4xx_it.c中设置按键中断
/* USER CODE BEGIN 0 */
#include "tim.h"
int PWM_Per =10;
int HZ=1599;
/* USER CODE END 0 */
/* USER CODE BEGIN EXTI15_10_IRQn 1 */
if( HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)==GPIO_PIN_SET)
{
__HAL_TIM_SetAutoreload(&htim3,HZ); //改变LD1频率由10Hz改成100Hz
__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_3,PWM_Per*10); //频率改变为100,LD1占空比放大10倍。
__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_2,PWM_Per); //改变LD2占空比。
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,PWM_Per); //改变LD3占空比。
if(PWM_Per>100)
{
PWM_Per=10;
HZ=15999;
}else
{
PWM_Per=PWM_Per+10;
}
}
/* USER CODE END EXTI15_10_IRQn 1 */
3.2 设置好后按一下LD2 LD3的占空比就变化了,每次都加10% 而LD1频率从10HZ变成100HZ
四、问题
不知道为什么,用仿真时在Keil的逻辑分析中一直输入不了对应的端口,看不到PWM波形。


顶一下,消灭0回复啊
