基于RK3576开发板的PWN使用说明

电子说

1.4w人已加入

描述

1. PWM简介

1.1  EASY EAI Orin-Nano的PWM资源

开发板

1.2  查找PWM节点

rk3576的pwm资源表如下:

开发板

【PWM2 CH3】对应的是pwm2_8ch_3,寄存地址为2ade3000。
       【PWM2 CH6】对应的是pwm2_8ch_6,寄存地址为2ade6000。

pwm驱动加载成功后,在文件系统/sys/class/pwm/下会产生pwm节点(pwmchip*),通过下方命令,可得知pwm节点与pwm资源的对应关系。

开发板

【PWM2 CH3】对应的节点为【pwmchip1】

【PWM2 CH6】对应的节点为【pwmchip2】

1.3  操作PWM节点

下方以操作【PWM2 CH3】为例:

首先通过命令进入到pwmchip1控制器(/sys/class/pwm/pwmchip1),能看到以下内容:

 

cd /sys/class/pwm/pwmchip1 ls

开发板

 

export:用于导出pwm定时器设备

unexport:用于释放pwm定时器设备

向export文件写入0,就会打开pwm定时器,会产生一个pwm0目录。

 

echo 0 > export

开发板

 

进入到pwm0定时器,就能设置它的各种属性,如周期、占空比等。

 

cd pwm0

开发板

echo 1000000 > period ##设置定时器1个周期内的脉冲个数 echo 500000 > duty_cycle ##设置定时器1个周期内低电平的脉冲个数 echo 1 > enable ##使能pwm定时器 echo 0 > enable ##禁能pwm定时器

 

相反往unexport文件写入0,就会关闭pwm定时器,同时pwm0目录会被删除。

 

cd .. echo 0 > unexport

开发板

 

2. 快速上手

2.1  例程源码下载

到【百度网盘】上下载相关的单例程序:

链接:https://pan.baidu.com/s/1RXHMGpmGSEfFy0rb1VkXSg?pwd=1234

提取码: 1234

比如在windows环境中,就把单例程序下载到:此电脑D:BaiduNetdisk (无规定,用户可自主选择),如下图所示。

开发板

然后把例程【复制粘贴】到nfs挂载目录中。(不清楚目录如何构建的,可以参考《入门指南/开发环境准备/nfs服务搭建与挂载》)

开发板

2.2  例程编译&运行

通过adb shell进入开发板环境(不清楚如何通过adb进行调试,可以参考《入门指南/开发板调试方式介绍/adb调试》),执行下方命令定位到demo目录,并且执行编译操作。

开发板

编译成功后,会生成1个叫test-pwm可执行程序在Release目录下。

运行例程命令如下所示:

 

sudo ./Release/test-pwm

 

执行效果如下所示。

开发板

通过示波器抓取的波形,如下图所示:

开发板

3. C语言使用案例

PWM的C语言使用案例,代码地址为10_PWM/test-pwm/main.c,供用户编码参考。以下代码展示了pwm控制器的初始化,调整周期,占空比,资源释放的操作流程:

 

int main(int argc, const char** argv) { int ret; ret = pwm_init("pwmchip1", "0"); printf("export_ret:%dn", ret); ret = pwm_set_attr("pwmchip1", "0", "period", "1000000"); printf("set_period_ret:%dn", ret); ret = pwm_set_attr("pwmchip1", "0", "duty_cycle", "500000"); printf("set_duty_cycle_ret:%dn", ret); ret = pwm_set_enable("pwmchip1", "0", "1"); printf("set_enable:%dn", ret); ret = pwm_release("pwmchip1", "0"); printf("unexport_ret:%dn", ret); //====================================================================== ret = pwm_init("pwmchip2", "0"); printf("export_ret:%dn",ret); ret = pwm_set_attr("pwmchip2", "0", "period", "1000000"); printf("set_period_ret:%dn",ret); ret = pwm_set_attr("pwmchip2", "0", "duty_cycle", "500000"); printf("set_duty_cycle_ret:%dn",ret); ret = pwm_set_enable("pwmchip2", "0", "1"); printf("set_enable:%dn",ret); ret = pwm_release("pwmchip2", "0"); printf("unexport_ret:%dn",ret); //====================================================================== return 0; }

 

其中pwm_init(),pwm_set_attr(),pwm_set_enable(),pwm_release()是对系统调用的易用化封装。具体实现于10_PWM/test-pwm/main.c

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分