NO5+PWM输出控制LED
本次实验使用通用定时器产生PWM信号,在对应的四个通道引脚输出,可外接示波器直接查看波形,如果没有示波器的可以将引脚接入LED灯对应引脚看LED灯亮度可以大致判断。
使用 CubeMX 软件生成代码:
选择定时器,并连接LED
选择TIM3进行设置
定时器的参数设定, 包括预分频系数、计数周期、PWM模式等
使能定时器 TIM3 中断, 因为要在中断回调中修改 TIMx_CRR 的值
设置引脚的输出模式,选用复用推挽输出
添加代码:
在main.c需要添加回调函数并打开中断,如下所示。
uint8_t WaveIndex[] = {1,1,2,2,3,4,6,8,10,14,19,25,33,44,59,80,107,143,191,255,
255,191,143,107,80,59,44,33,25,19,14,10,8,6,4,3,2,2,1,1};
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
HAL_TIM_Base_Start_IT(&htim3);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
while (1)
{
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint8_t PwmIndex = 1; /* 用于 PWM 查表 */
static uint8_t PeriodCnt = 0; /* 用于计算周期数 */
PeriodCnt++;
/* 若输出的周期数大于 20,输出下一种脉冲宽的 PWM 波 */
if (PeriodCnt >= 20) {
/* 根据 PWM 表修改定时器的比较寄存器值 */
htim3.Instance->CCR3 = WaveIndex[PwmIndex];
/* 标志 PWM 表的下一个元素 */
PwmIndex++;
/* 若 PWM 脉冲表已经输出完成一遍,重置 PWM 查表标志 */
if ( PwmIndex >= 40) {
PwmIndex=0;
}
/* 重置周期计数标志 */
PeriodCnt=0;
}
}
实验现象:可以观察到 LED1 的呈现呼吸灯形式亮灭。