【产品应用】AWorksLP 样例详解(MR6450)——PWM(单通道)

aworkslp 对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以mr6450(点击了解详情)平台为例,介绍aworkslp pwm 外设基本用法。
简介
脉冲宽度调制(pwm),是英文“pulse width modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。以下简述几个关键的概念:
图1
pwm周期:指信号从高电平到低电平再回到高电平的时间,如上图t所示。pwm频率一秒内pwm周期的次数。占空比:一个周期内高电平持续时间所占的比例即(t1 / t)。脉宽时间:高电平时间。
接口介绍
函数列表:
函数原型
简要描述
aw_err_t  aw_pwm_enable (int fd);
使能pwm设备输出
aw_err_t  aw_pwm_disable (int fd);
pwm设备输出停止
aw_err_t  aw_pwm_accurate_output (int fd, uint32_t  period_num);
精确输出 period_num 个周期pwm波
aw_err_t  aw_pwm_config_set (int fd, aw_const  aw_pwm_config_t *p_config);
设置pwm设备参数配置
aw_err_t  aw_pwm_config_get (int fd, aw_pwm_config_t  *p_config);
获取pwm设备的配置参数
aw_err_t aw_pwm_config_frac_set  (int fd, aw_const aw_pwm_config_frac_t *p_config);
以更加精确的形式设置pwm设备的参数
aw_err_t  aw_pwm_config_frac_get (int fd,  aw_pwm_config_frac_t *p_config);
获取pwm设备的分数形式配置参数
下表为pwm接口相关结构体类型。
结构体类型表:
类型
简要描述
aw_pwm_config_t
pwm配置参数结构体
aw_pwm_config_frac_t
pwm配置参数结构体(分数形式),用分数表示,更精确
pwm 配置信息说明:
1. aw_pwm_config_t
     typedef struct { uint32_t  duty_ns; uint32_t  period_ns; uint32_t  is_inverse;} aw_pwm_config_t;
pwm配置参数结构体。
成员详解:
duty_ns:pwm周期中高电平的有效时间 ns为单位。period_ns:pwm周期ns为单位。is_inverse:输出波形是否反相,0表示不反相。
2. aw_pwm_config_frac
        typedef struct aw_pwm_config_frac { 
uint32_t  duty_numerator; uint32_t  duty_denominator;   uint32_t  period_numerator; uint32_t  period_denominator; uint32_t  is_inverse;} aw_pwm_config_frac_t;
pwm配置参数结构体(分数形式),用分数表示,更精确。
成员详解:
duty_numerator:pwm周期中高电平的有效时间分子部分。
duty_denominator:pwm周期中高电平的有效时间分母部分。
period_numerator:pwm周期分子部分。
period_denominator:pwm周期分母部分。
is_inverse:pwm输出波形输出是否反向,0:不反向,1:反向。
使用样例
aworkslp sdk相关使用请参考《aworkslp sdk快速入门(mr6450)——开箱体验》一文,本文不在赘述。
1. pwm单通道输出功能{sdk}\demos\peripheral\pwm路径下为pwm例程,例程关键代码如下:
                                                                         /** * \brief pwm演示例程入口 * \return 无 */aw_local void* __task_handle (void *arg){ uint32_t period1 = 2000000; /* (ns) */ uint32_t period2 = 1000000; /* (ns) */ int fd; int ret; aw_pwm_config_t pwm_config;
aw_kprintf(\npwm demo testing...\n); fd = aw_open(config_demo_pwm_device_name, aw_o_rdwr, 0); if(fd < 0){ aw_kprintf(pwm open failed \r\n); aw_close(fd); return 0; } ret = aw_pwm_config_get(fd, &pwm_config);
/* period 配置不可以为0 * duty配置为0,这时可以配置成功:输出一直为低 * duty配置为peroid,占空比为100%,也可配置成功:输出一直为高 * pwm正在进行输出,不可配置 */ pwm_config.duty_ns = period1 / 2; pwm_config.is_inverse = 0; pwm_config.period_ns = period1; aw_pwm_config_set(fd, &pwm_config); while(1) {
/* 配置 pwm 的有效时间(高电平时间)50% ,周期 period1*/ aw_pwm_config_set(fd, &pwm_config); aw_pwm_enable(fd); /* 使能通道 */ aw_mdelay(250); aw_pwm_disable(fd); /* 禁能通道 */ aw_mdelay(250); /* 输出五个周期pwm波*/ aw_pwm_accurate_output(fd, 5);
/* 配置 pwm 的有效时间(高电平时间)2% ,周期 period1*/ pwm_config.duty_ns = period1 / 50; aw_pwm_config_set(fd, &pwm_config); aw_pwm_enable(fd); /* 使能通道 */ aw_mdelay(250); aw_pwm_disable(fd); /* 禁能通道 */ aw_mdelay(250);
pwm_config.duty_ns = period2 / 2; pwm_config.period_ns = period2; /* 配置 pwm 的有效时间(高电平时间)50% ,周期 period2*/ aw_pwm_config_set(fd, &pwm_config); aw_pwm_enable(fd); /* 使能通道 */ aw_mdelay(250); aw_pwm_disable(fd); /* 禁能通道 */ aw_mdelay(250);
/* 配置 pwm 的有效时间(高电平时间)2% ,周期 period2*/ pwm_config.duty_ns = period2 / 50; aw_pwm_config_set(fd, &pwm_config); aw_pwm_enable(fd); /* 使能通道 */ aw_mdelay(250); aw_pwm_disable(fd); /* 禁能通道 */ aw_mdelay(250);
pwm_config.duty_ns = period1 / 2; pwm_config.period_ns = period1; }
return 0;}
例程默认使用pwm3_chan4对应开发板的位置如图2所示:
图2 pwm排针
上述代码中使用aw_pwm_config_get接口获取pwm当前的配置信息,pwm周期中高电平的有效时间为1000000ns,pwm周期为2000000ns,也就是设置pwm的占空比为50%。使用aw_pwm_config_set接口设置pwm。使用aw_pwm_enable接口使能pwm,使用aw_pwm_disable接口关闭pwm,使用aw_pwm_accurate_output接口输出任意个pwm波。 
在while循环中每间隔一段时间通过设置pwm的参数,从而输出各种pwm的波形,下图为例程中输出的各种pwm波形。
图3 占空比50%,周期2ms
图4 占空比2%,周期2ms
图5 占空比50%,周期1ms
图6 占空比2%,周期1ms
2. 蜂鸣器输出{sdk}\demos\peripheral\buzzer路径下为蜂鸣器例程,例程关键代码如下:
                             /** * \brief 建立蜂鸣器例程入口 * \return 无 */aw_local void* __task_handle (void *arg){ int fd; fd = aw_open(/dev/buzzer, aw_o_rdwr, 0); if(fd < 0){ aw_kprintf(buzzer open failed \r\n); aw_close(fd); return 0; }
while(1) { /* 强度调节设备驱动无源蜂鸣器 */ aw_buzzer_loud_set(fd, 80); /* 设置蜂鸣器鸣叫强度 */ aw_buzzer_beep(fd, 500); /* 启动蜂鸣器延时500ms */
/* gpio驱动直流蜂鸣器 */ aw_buzzer_loud_set(fd, 50); /* 设置蜂鸣器鸣叫强度 */ aw_buzzer_on(fd); /* 启动蜂鸣器 */ aw_mdelay(500); /* 延时500ms */ aw_buzzer_off(fd); /* 关闭蜂鸣器 */ aw_mdelay(500); /* 延时500ms */ } aw_close(fd); return 0;}
蜂鸣器在开发板上的位置如图7所示。
图7 蜂鸣器位置
蜂鸣器引脚所对应的pwm通道为pwm3_chan1,如下图所示。
图8 蜂鸣器对应引脚
图9 pwm对应引脚
图10 蜂鸣器对应的pwm通道
上述代码中在while循中环使用aw_buzzer_loud_set接口设置蜂鸣器的鸣叫程度为80,相当于调节pwm的占空比。然后使用aw_buzzer_beep接口使蜂鸣器鸣叫一段时间后关闭。再设置蜂鸣器的鸣叫程度为50,使用aw_buzzer_on接口启动蜂鸣器,相当于使能pwm,延时一段时间后用aw_buzzer_off接口关闭蜂鸣器,相当于关闭pwm,然后再延时一段时间。实验现象为蜂鸣器先以较大的声音鸣叫一段时间后以较小的声音鸣叫一段时间后停止鸣叫,持续一段时间后再次循环。在pwm例程中,pwm作为设备资源被buzzer引用,可在配置界面中查看所有可引用资源,也可以在界面中查看当前平台所有pwm资源,以便在软件设计过程中查看修改。本文以pwm外设通用接口为例,演示了单通道的输出以及接口特性,同时与蜂鸣器进行设备绑定,后续将会更详细的介绍多通道的输出以及相关特性,请持续关注后续推文~

什么是强化学习
介绍基于不确定的语法条件生成类似Java的强类型程序
2019年华为5G手机总售出690万台,智能手机发货量超过2.4亿台
微型电池需求爆发 小电池企业利好
关于外转子无刷电机电磁设计案例的详细说明
【产品应用】AWorksLP 样例详解(MR6450)——PWM(单通道)
三星公布2020年QLED电视产品线,都将采用有源语音增强功放器
节能性能优异的升降压型DC/DC转换器BD83070GWL介绍
AI技术有什么新的发展方向萌芽
低温下安装振弦采集仪注意事项
什么是LED光色质量
关于人工智能最佳交互界面的分析介绍
为什么我抓不到baidu的数据包
Amber Solutions 专利支持电网的数字化管理
Renesas推出SH-Mobile高端产品
人工智能引领新一代科技革命!
微软多管齐下,构建现代化数据安全架构
中国集成电路发展带来了大的机遇,但是挑战也是前所未有
CPU+fpga适应市场需求,从封装集成走向管芯集成
脉冲电流对电路有什么影响