微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > NO5+PWM输出控制LED

NO5+PWM输出控制LED

时间:10-02 整理:3721RD 点击:
       系统滴答定时器对于STM32系列单片机来说是用来提供“心跳”的,而定时器最基本功能也是定时,可以设置不同时间长度的定时。定时器除了最基本的定时功能外,定时器与GPIO有联合使得它可以发挥强大的作用,比如可以输出不同频率、不同占空比的方波信号、PWM信号,同时做为输入捕获功能时,可以测量脉冲宽度、实现电容按键检测等等。
      本次实验使用通用定时器产生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 的呈现呼吸灯形式亮灭。  


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top