有了前面点亮小灯的经验,我们可以试试PWM波来点亮小灯,满足调节亮度的需求。
1. 实验器材
- 一块单片机最小系统板或开发板
- ST-Link调试器或板载ST-Link
2. 实验准备
此处,小柯依然使用正点原子的阿波罗开发板。板载的两个LED灯泡DS0和DS1对应外设情况如下:
小灯编号 | 引脚 | 定时器端口 | 通道编号 |
---|---|---|---|
DS0 | PB1 | TIM3 | CH4 |
DS1 | PB0 | TIM3 | CH3 |
根据以上信息,我们在工程中作如下配置:
-
将对应引脚设置为TIM的输出通道,此时引脚为黄色
-
在对应的TIM外设中使能相关通道,此时引脚颜色转为绿色
-
根据需要,对TIM参数进行进一步配置
如选择内部时钟作为时钟源,将自动重载值(Auto Reload Register)改为65534.
当TIM用作PWM时,建议不要将自动重载值设置设置为最大值,之多是上限值减一。由于此处,该寄存器为16位,那便设置为65534.具体原因小柯会在介绍PWM中解释。
-
保存工程,生成代码
-
复制库文件,添加各头文件目录,将用到的 Klib_Device_Layer 目录作为编译的对象。
详见 stm32-kirk-lib使用笔记 - 001 综述
-
添加用到的源文件
本实验中用到的源文件为 Klib_Device_Layer 目录下的 kdl.c 和 kdl_pwmled.c,将其他 c 文件移出编译范围。
-
引用头文件,添加LED对象
LED对象定义在 kdl_pwmled.h 头文件中,为 KDL_PWMLED_t。具体代码如下:
/* USER CODE BEGIN Includes */
#include "kdl_pwmled.h"
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
KDL_PWMLED_t DS0;
KDL_PWMLED_t DS1;
/* USER CODE END PV */
3. 简介
3.1 宏定义简介
3.1.1 KDL_PWMLED_OnState
/**
* @brief enum of PWMLED status for on
*/
typedef enum {
KDL_PWMLED_ONSTATE_LOW = 0,
KDL_PWMLED_ONSTATE_HIGH
} KDL_PWMLED_OnState;
项目 | 说明 |
---|---|
名称 | KDL_PWMLED_OnState |
KDL_PWMLED_ONSTATE_LOW | PWM输出为低时LED被点亮 |
KDL_PWMLED_ONSTATE_HIGH | PWM输出为高时LED被点亮 |
3.1.2 默认值
#define KDL_PWMLED_GAMMA_SCALER 20000U
#define KDL_PWMLED_DEFAULT_GAMMA 44000U /* 2.2*2W=4W4 */
#define KDL_PWMLED_DEFAULT_BRIGHTNESSRANGE 255U
#define KDL_PWMLED_DEFAULT_BOUNDRANGE 255U
项目 | 说明 |
---|---|
KDL_PWMLED_GAMMA_SCALER | Gamma值的放大倍数 |
KDL_PWMLED_DEFAULT_GAMMA | 默认Gamma值为2.2,放大后为44000 |
KDL_PWMLED_DEFAULT_BRIGHTNESSRANGE | 默认亮度设置范围 |
KDL_PWMLED_DEFAULT_BOUNDRANGE | 默认亮度限制 |
3.2 接口函数简介
3.2.1 KDL_PWMLED_Init