在基础定时器的基础上增加了1~4个捕获/比较通道
这些定时器通道可以输入/输出
通道之间可以组合使用
TIM2和TIM5是32位的(CNT.ARR.CCR),计数最大值更大(PSC仍然是16位)
PWM 叫脉冲宽度调制就是通过输入矩形脉冲的数字信号去实现模拟信号的手段
PWM 有两个重要的参数:
第一个就是输出频率,频率越高,则模拟的效果越好即分辨率越大
第二个就是占空比(在一个周期内控制高电平的时间占比)
//占空比就是改变输出模拟效果的电压大小,占空比越大则模拟出的电压越大。
CCR内会存储一个比较值
当CNT等于CCR时,定时器输出由高电平变为低电平
当CNT等于ARR时,定时器输出由低电平变为高电平,CNT清零
占空比D为CCR/(ARR+1)
如果CCR=0,输出一直为低
如果CCR>ARR,输出一直为高
打开Cube
见PH12设置为PWM输出,即选择TIM5_CH3
在Timers的TIM5里把Internal Clock勾选上,即打开时钟源
在下面对应的Channel3中选择PWM Generation CH3即打开PWM模式
TIM5是84MHz的,因此需要在下面的PSC设置为84-1,ARR设置为1000-1
(这样就会有1MHz的时钟输入)
下面PWM Generation Channel 3中有CH Polarity(默认为Hight)
如果改为low,PWM就会反向输出(即占空比=1-占空比)
不需要打开中断,因为PWM输出不需要使用中断
中断一般只跟定时器本身的时钟溢出有关
设置好后生成代码
在main.c文件中的USER CODE BEGIN 2/END 2中间启动PWM
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim5,TIM_CHANNEL_3);
/* USER CODE END 2 */
//&htim5代表TIM5定时器
//TIM_CHANNEL_3即对应的通道
在USER CODE BEGIN PV/END PV里写一个计数的counter
/* USER CODE BEGIN PV */
uint16_t counter=0;
/* USER CODE END PV */
然后在while(1)循环里让counter计数
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
counter++;
if (counter==1001)
{
counter=0;
}
HAL_TIM_SET_COMPARE(&htim5,TIM_CHANNEL_3,counter);
HAL_Delay(1);
}
/* USER CODE END 3 */
看一下HAL_TIM_SET_COMPARE这个宏定义函数的定义
#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \
(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\
((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\
((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\
((__HANDLE__)->Instance->CCR4 = (__COMPARE__)))
//首先它会判断这个通道是CH1,CH2,CH3还是CH4
//然后去访问对应的CCR寄存器
//并且把COMPARE的值赋给它
//从而实时更改CCR的值
然后编译烧录
当给无源蜂鸣器一个频率的方波时,无源蜂鸣器就发出这个频率的声音
PWM占空比恒为50%
实时改变ARR和CCR的值以调整频率
使用按键触发蜂鸣器
设置蜂鸣器引脚PD14设置为TIM4-CH3
把TIM4时钟源设置为内部时钟
通道3设置为PWM输出
PSC设置为84-1输出1MHz
ARR不用进行设置
然后生成代码
先在USER CODE BEGIN 2/END 2里把定时器打开
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
/* USER CODE END 2 */
在while(1)中编写
/* USER CODE BEGIN 3 */
if (HAL_GPIO_ReadPin(GPIOA ,GPIO_PIN_0)==GPIO_PIN_RESET)
{
__HAL_TIM_SET_AUTORELOAD(&htim4,1000-1);//ARR设为1000-1
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,1000/2);//PWM占空比为50%
}
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)
{
__HAL_TIM_SET_AUTORELOAD(&htim4,65535);//恢复初始值
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,0);//PWM占空比为0
}
HAL_Delay(100);//防止程序卡死
}
/* USER CODE END 3 */
__HAL_TIM_SET_AUTORELOAD()//可以用来设置ARR
__HAL_TIM_SET_COMPARE//用来设置占空比
然后进行编译烧录。
CH2.2 TIM 第2讲 通用定时器与PWM【南工骁鹰嵌入式软件培训】