3.7 PWM呼吸灯实验
一、实验目的
本节课主要学习K210的PWM功能。
二、实验准备
1.实验元件
独立按键BOOT、RGB灯
2.元件特性
K210芯片定时器总共有3个,每个定时器有4路通道。每个定时器可以设置触发间隔,和定时器中断处理函数。定时器还可以设置为PWM输出的功能,但是如果设置PWM输出,则不可以使用定时的功能。
3.硬件连接
K210开发板出厂默认已经焊接好RGB灯。RGB灯R连接的是IO6,G连接的是IO7, B连接的是IO8。
4.SDK中对应API功能
对应的头文件 pwm.h
脉冲宽度调制器PWM用于控制脉冲输出的占空比,其本质是一个定时器,所以注意设置PWM号与通道时,不要与TIMER定时器冲突。
为用户提供以下接口:
• pwm_init
• pwm_set_frequency
• pwm_set_enable
三、实验原理
PWM控制的是脉冲输出的占空比,占空比是指在一个脉冲循环内,通电时间相对于总时间所占的比例。比如说,一个RGB灯在它一个工作周期中有一半时间被接通了,那么它的占空比就是50%,同时亮度也只有50%。如果加在该工作元件上的信号电压为3V,则实际的工作电压平均值或电压有效值就是1.5V。
四、实验过程
1.首先根据上面的硬件连接引脚图,K210的硬件引脚和软件功能使用的是FPIOA映射关系。这里映射的是定时器1的通道0(开关1)。
2.第二步需要初始化外部中断服务,并且使能全局中断。如果没有这一步操作,系统的中断就不会运行,所以也不会调用中断回调函数。
3.初始化定时器,这里使用的是定时器0通道0,超时时间为10毫秒,定时器中断回调函数为timer_timeout_cb,参数为空NULL。
4.初始化PWM,设置PWM为定时器1通道0,频率为200KHz,占空比为0.5的方波。
5.在定时器中断中设置PWM的占空比,根据duty_cycle的不同值,来修改PWM的占空比,从而改变RGB灯的亮度。
6.最后是一个while(1)循环,这个是必须的,否则系统就会退出,不再运行。
7.编译调试,烧录运行
把本课程资料中的pwm复制到SDK中的src目录下,然后进入build目录,运行以下命令编译。
cmake .. -DPROJ=pwm -G "MinGW Makefiles"
make
编译完成后,在build文件夹下会生成pwm.bin文件。
使用type-C数据线连接电脑与K210开发板,打开kflash,选择对应的设备,再将程序固件烧录到K210开发板上。
五、实验现象
RGB灯亮红色,而且显示呼吸灯效果,颜色从最亮逐渐变暗,再从熄灭状态中逐渐变亮,一直循环。
六、实验总结
1.PWM的内部实现是基于定时器的定时功能。
2.控制PWM的两个重要因素是频率和占空比。
3.PWM输出修改的是占空比,也就是通电时间占总时间的百分比,改变了输出的有效值,从而改变了RGB灯的亮度。
附:API
对应的头文件 pwm.h
初始化PWM。
void pwm_init(pwm_device_number_t pwm_number)
参数名称 | 描述 | 输入输出 |
pwm_number | pwm号 | 输入 |
无。
设置频率及占空比。
double pwm_set_frequency(pwm_device_number_t pwm_number, pwm_channel_number_t channel, double frequency, double duty)
参数名称 | 描述 | 输入输出 |
pwm_number | PWM号 | 输入 |
channel | PWM通道号 | 输入 |
frequency | PWM输出频率 | 输入 |
duty | 占空比 | 输入 |
实际输出频率。
使能禁用PWM。
void pwm_set_enable(pwm_device_number_t pwm_number, uint32_t channel, int enable)
参数名称 | 描述 | 输入输出 |
pwm_number | PWM号 | 输入 |
channel | PWM通道号 | 输入 |
enable | 使能禁用PWM | 输入 |
无。
/* pwm0 channel 1 输出 200KHZ占空比为0.5的方波 */
/* 设置IO13作为PWM的输出管脚 */
fpioa_set_function(13, FUNC_TIMER0_TOGGLE2);
pwm_init(PWM_DEVICE_0);
pwm_set_frequency(PWM_DEVICE_0, PWM_CHANNEL_1, 200000, 0.5);
pwm_set_enable(PWM_DEVICE_0, PWM_CHANNEL_1, 1);
· pwm_device_number_t:pwm号。
· pwm_channel_number_t:pwm通道号。
pwm号。
typedef enum _pwm_device_number
{
PWM_DEVICE_0,
PWM_DEVICE_1,
PWM_DEVICE_2,
PWM_DEVICE_MAX,
} pwm_device_number_t;
成员名称 | 描述 |
PWM_DEVICE_0 | PWM0 |
PWM_DEVICE_1 | PWM1 |
PWM_DEVICE_2 | PWM2 |
pwm通道号。
typedef enum _pwm_channel_number
{
PWM_CHANNEL_0,
PWM_CHANNEL_1,
PWM_CHANNEL_2,
PWM_CHANNEL_3,
PWM_CHANNEL_MAX,
} pwm_channel_number_t;
成员名称 | 描述 |
PWM_CHANNEL_0 | PWM通道0 |
PWM_CHANNEL_1 | PWM通道1 |
PWM_CHANNEL_2 | PWM通道2 |
PWM_CHANNEL_3 | PWM通道3 |