目录
1. CubeMX设置
原理:
捕获/比较模式寄存器1(TIMx_CCMR1)
OC1M[2:0]:输出比较1模式 (Output compare 1 enable)
110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
打开cubeMX,设置TIM3时钟源为内部时钟,通道3为PWM输出,对于PB0:
PSC分频设置200-1,计数周期为1024-1,CCR预加载Disable,开启NVIC中断:
2. 程序开发
在main.c开启TIM3的时钟中断和PWM:
//main.c
HAL_TIM_Base_Start_IT(&htim3);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
在time.c输入如下代码,设置呼吸灯变量等:
//time.c
//控制输出波形的频率
__IO uint16_t period_class = 10;
/* LED亮度等级 PWM表,指数曲线 ,此表使用工程目录下的python脚本index_wave.py生成*/
uint16_t indexWave[] = {
1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4,
4, 5, 5, 6, 7, 8, 9, 10, 11, 13,
15, 17, 19, 22, 25, 28, 32, 36,
41, 47, 53, 61, 69, 79, 89, 102,
116, 131, 149, 170, 193, 219, 250,
284, 323, 367, 417, 474, 539, 613,
697, 792, 901, 1024, 1024, 901, 792,
697, 613, 539, 474, 417, 367, 323,
284, 250, 219, 193, 170, 149, 131,
116, 102, 89, 79, 69, 61, 53, 47, 41,
36, 32, 28, 25, 22, 19, 17, 15, 13,
11, 10, 9, 8, 7, 6, 5, 5, 4, 4, 3, 3,
2, 2, 2, 2, 1, 1, 1, 1
};
//计算PWM表有多少个元素
uint16_t POINT_NUM = sizeof(indexWave)/sizeof(indexWave[0]);
/* USER CODE BEGIN 1 */
/**
* @brief Period elapsed callback in non-blocking mode
* @param htim TIM handle
* @retval None
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
static uint16_t pwm_index = 0; //用于PWM查表
static uint16_t period_cnt = 0; //用于计算周期数
period_cnt++;
TIM3->CCR3=indexWave[pwm_index];
if(period_cnt > period_class)
{
pwm_index++; //标志PWM表指向下一个元素
//若PWM表已到达结尾,重新指向表头
if(pwm_index>=POINT_NUM)
{
pwm_index=0;
}
period_cnt=0; //重置周期计数标志
}
}
}
3. 实验结果
灯像呼吸一样,一亮一暗的