3.7 PWM呼吸灯实验

您当前位置: 首页 > K210开发者套件 > 基础实验例程

3.7 PWM呼吸灯实验

一、实验目的

本节课主要学习K210的PWM功能。

 

二、实验准备

1.实验元件

   独立按键BOOT、RGB灯

image.png

2.元件特性

K210芯片定时器总共有3个,每个定时器有4路通道。每个定时器可以设置触发间隔,和定时器中断处理函数。定时器还可以设置为PWM输出的功能,但是如果设置PWM输出,则不可以使用定时的功能。

3.硬件连接

K210开发板出厂默认已经焊接好RGB灯。RGB灯R连接的是IO6,G连接的是IO7, B连接的是IO8。

image.pngimage.png

 

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)。

image.png

image.png

2.第二步需要初始化外部中断服务,并且使能全局中断。如果没有这一步操作,系统的中断就不会运行,所以也不会调用中断回调函数。

image.png

3.初始化定时器,这里使用的是定时器0通道0,超时时间为10毫秒,定时器中断回调函数为timer_timeout_cb,参数为空NULL。

image.png

4.初始化PWM,设置PWM为定时器1通道0,频率为200KHz,占空比为0.5的方波。

image.png

5.在定时器中断中设置PWM的占空比,根据duty_cycle的不同值,来修改PWM的占空比,从而改变RGB灯的亮度。

image.png

6.最后是一个while(1)循环,这个是必须的,否则系统就会退出,不再运行。

image.png

7.编译调试,烧录运行

把本课程资料中的pwm复制到SDK中的src目录下,然后进入build目录,运行以下命令编译。

cmake .. -DPROJ=pwm -G "MinGW Makefiles"

make

image.png

编译完成后,在build文件夹下会生成pwm.bin文件。

使用type-C数据线连接电脑与K210开发板,打开kflash,选择对应的设备,再将程序固件烧录到K210开发板上。

 

五、实验现象

RGB灯亮红色,而且显示呼吸灯效果,颜色从最亮逐渐变暗,再从熄灭状态中逐渐变亮,一直循环。

 image.pngimage.png

 

六、实验总结

1.PWM的内部实现是基于定时器的定时功能。

2.控制PWM的两个重要因素是频率和占空比。

3.PWM输出修改的是占空比,也就是通电时间占总时间的百分比,改变了输出的有效值,从而改变了RGB灯的亮度。

 

 

附:API

对应的头文件 pwm.h

pwm_init

描述

初始化PWM

函数原型

void pwm_init(pwm_device_number_t pwm_number)


参数


参数名称

描述

输入输出

pwm_number

pwm

输入

返回值

无。

pwm_set_frequency

描述

设置频率及占空比。

函数原型

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_set_enable

描述

使能禁用PWM

函数原型

void pwm_set_enable(pwm_device_number_t pwm_number, uint32_t channel, int enable)


参数

参数名称

描述

输入输出

pwm_number

PWM

输入

channel

PWM通道号

输入

enable

使能禁用PWM
  0
:禁用 1:使能

输入

返回值

无。

举例

/* 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_tpwm号。

·         pwm_channel_number_tpwm通道号。

pwm_device_number_t

描述

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_channel_number_t

描述

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