世界微头条丨RK3588开发板(armsom-w3)之PWM实操
PWM介绍
专栏总目录PWM是脉宽调制(Pulse Width Modulation)的缩写。它是一种用于控制电子设备的技术,通过改变电信号的脉冲宽度来实现对设备的控制。PWM基本概念
PWM信号由一个固定频率的周期性脉冲序列组成,每个脉冲的宽度(持续时间)可以根据需要进行调节。调节脉冲宽度的比例可以改变平均电压或电流的大小,从而实现对设备的控制。
当谈论PWM时,以下三个关键术语经常被提及:
频率(Frequency):PWM信号的频率是指每秒钟内脉冲的数量。
【资料图】
周期(Period):PWM信号的周期是指一个完整脉冲序列所花费的时间。它是频率的倒数,以秒为单位表示。周期可以通过将频率的倒数计算得到,例如,一个10kHz的PWM信号的周期为0.1毫秒(100微秒)。
占空比(Duty Cycle):占空比是指PWM信号中脉冲宽度与周期之间的比例关系。它表示了脉冲在一个周期中所占据的时间比例,通常以百分比表示。占空比为0%意味着脉冲不存在(完全低电平),而占空比为100%表示脉冲持续时间占据了整个周期(完全高电平)。在实际应用中,占空比可以在0%到100%之间任意调整,以实现所需的控制效果。
PWM驱动
pwm驱动是一个通用的驱动,SOC厂家都会在SDK里面默认打开
驱动文件
驱动文件所在位置:
drivers/pwm/pwm-rockchip.c
默认SDK已经加载好了PWM的驱动,下文我们主要注意PWM怎么使用
DTS 节点配置
DTS 配置参考文档
Documentation/devicetree/bindings/pwm/pwm.txt
以下为一个例子的示例
Node name { compatible = "Driver matching character"; pwms = < &pwmX 0 25000 0 >; }; &pwmX { status = "okay"; pinctrl-names = "active"; pinctrl-0 = < &pwmX_pin_pull_down >; };
pwms的几个参数说明如下:
参数 1,表示 index (per-chip index of the PWM to request),一般是 0,因为我们 Rockchip PWM 每个chip 只有一个。
参数 2,表示 PWM 输出波形的时间周期,单位是 ns;例如下面配置的 25000 就是表示想要得到的
PWM 输出周期是 40K 赫兹。
参数 3,表示极性,为可选参数;下面例子中的配置为负极性。
PWM使用
PWM 提供了用户层的接口,在 /sys/class/pwm/ 节点下面,PWM 驱动加载成功后,会在/sys/class/pwm/ 目录下产生 pwmchip0 目录;向 export 文件写入 0,就是打开 pwm 定时器0,会产生一个 pwm0 目录,相反的往 unexport 写入 0 就会关闭 pwm 定时器了,同时 pwm0 目录会
被删除,该目录下有以下几个文件:
enable:写入 1 使能 pwm,写入 0 关闭 pwm;
polarity:有 normal 或 inversed两个参数选择,表示输出引脚电平翻转;
duty_cycle:在 normal 模式下,表示一个周期内高电平持续的时间(单位:纳秒),在
reversed 模式下,表示一个周期中低电平持续的时间(单位:纳秒);
period:表示 pwm 波的周期(单位:纳秒);
以下是 pwmchip0 的例子,设置 pwm0 输出频率 100K,占空比 50%, 极性为正极性:
cd /sys/class/pwm/pwmchip0/echo 0 > exportcd pwm0echo 10000 > periodecho 5000 > duty_cycleecho normal > polarityecho 1 > enable
PWM应用实例
通常电子设备中应用pwm是比较常见的,比如风扇电机控制,电视背光控制, LED 照明调光、电动工具马达控制、汽车加热器等领域。
这里简单介绍一下pwm控制LED灯实现呼吸灯效果。
呼吸灯需要灯的驱动与PWM的驱动结合,两个驱动之间传递数据,我们可以在驱动中调用其他的驱动。
led是我需要的设备,这个设备用到了pwm,而pwm是用默认的驱动。
硬件上我们在开发板找到具有pwm功能的引脚
设备树的修改如下:
/{breathing_light {compatible = "lhd,breathing_light_test";backlight {pwms = < &pwm8 0 25000 0 >;pwm-names = "breathing_light"; };};};&pwm8 {status = "okay";};
写一个驱动。内部在使用PWM子系统。形成了包含驱动的驱动。
示例代码
驱动程序
#include < linux/init.h >#include < linux/module.h >#include < linux/fs.h >#include < linux/cdev.h >#include < linux/uaccess.h >#include < linux/types.h >#include < linux/kernel.h >#include < linux/delay.h >#include < linux/ide.h >#include < linux/errno.h >#include < linux/gpio.h >//#include < asm/mach/map.h >#include < linux/of.h >#include < linux/of_address.h >#include < linux/of_gpio.h >#include < asm/io.h >#include < linux/device.h >#include < linux/platform_device.h >#include < linux/pwm.h >#define RED_LED_DTS_COMPATIBLE "lhd,breathing_light_test" /* 设备树节点匹配属性 */#define LED_PWM_CMD_SET_DUTY 0x01#define LED_PWM_CMD_SET_PERIOD 0x02#define LED_PWM_CMD_SET_BOTH 0x03#define LED_PWM_CMD_ENABLE 0x04#define LED_PWM_CMD_DISABLE 0x05struct led_pwm_param{ int duty_ns; int period_ns;};struct red_led_dev { dev_t dev_no; struct cdev chrdev; struct class *led_class; struct device_node *dev_node; struct pwm_device *red_led_pwm;};static struct led_pwm_param led_pwm;static struct red_led_dev led_dev;static int red_led_drv_open (struct inode *node, struct file *file){ int ret = 0; //pwm_set_periodnnn(led_dev.red_led_pwm, PWM_POLARITY_INVERSED);//设置PWM信号的极性pwm_enable(led_dev.red_led_pwm);//启用指定PWM设备,使其开始输出PWM信号。 printk("red_led_pwm open"); return ret;}static ssize_t red_led_drv_write (struct file *file, const char __user *buf, size_t size, loff_t *offset){ int err; if (size != sizeof(led_pwm)) return -EINVAL;err = copy_from_user(&led_pwm, buf, size); if (err > 0) return -EFAULT;pwm_config(led_dev.red_led_pwm, led_pwm.duty_ns, led_pwm.period_ns);//配置PWM设备的基本参数,如频率、占空比等。 printk("red_led_pwm write");return 1;}static long drv_ioctl(struct file *filp, unsigned int cmd, unsigned long arg){ int ret = 0; void __user *my_user_space = (void __user *)arg; switch (cmd) { case LED_PWM_CMD_SET_DUTY: ret = copy_from_user(&led_pwm.duty_ns, my_user_space, sizeof(led_pwm.duty_ns)); if (ret > 0) return -EFAULT; pwm_config(led_dev.red_led_pwm, led_pwm.duty_ns, led_pwm.period_ns); break; case LED_PWM_CMD_SET_PERIOD: ret = copy_from_user(&led_pwm.period_ns, my_user_space, sizeof(led_pwm.period_ns)); if (ret > 0) return -EFAULT; pwm_config(led_dev.red_led_pwm, led_pwm.duty_ns, led_pwm.period_ns); break; case LED_PWM_CMD_SET_BOTH: ret = copy_from_user(&led_pwm, my_user_space, sizeof(led_pwm)); if (ret > 0) return -EFAULT; pwm_config(led_dev.red_led_pwm, led_pwm.duty_ns, led_pwm.period_ns); break; case LED_PWM_CMD_ENABLE: pwm_enable(led_dev.red_led_pwm); break; case LED_PWM_CMD_DISABLE: pwm_disable(led_dev.red_led_pwm); break; } return 0;}static int red_led_drv_release(struct inode *node, struct file *filp){ int ret = 0; pwm_config(led_dev.red_led_pwm, 0, 5000);//配置PWM设备的基本参数,如频率、占空比等。 printk("led pwm dev close");// pwm_disable(led_dev.red_led_pwm); return ret;}static struct file_operations red_led_drv = {.owner = THIS_MODULE,.open = red_led_drv_open,.write = red_led_drv_write, .unlocked_ioctl = drv_ioctl, .release = red_led_drv_release,};/*设备树的匹配列表 */static struct of_device_id dts_match_table[] = { {.compatible = RED_LED_DTS_COMPATIBLE, }, {}, };static int led_red_driver_probe(struct platform_device *pdev){ int err; int ret; struct device *tdev; struct device_node *child; tdev = &pdev- >dev; child = of_get_next_child(tdev- >of_node, NULL); /* 获取设备树子节点 */if (!child) { return -EINVAL; } led_dev.red_led_pwm = devm_of_pwm_get(tdev, child, NULL); /* 从子节点中获取PWM设备,设备树获取这个设备就可以了 */ if (IS_ERR(led_dev.red_led_pwm)) { printk(KERN_ERR"can"t get breathing_light!!"); return -EFAULT; } ret = alloc_chrdev_region(&led_dev.dev_no, 0, 1, "breathing_light");//动态分配字符设备的主设备号if (ret < 0) {pr_err("Error: failed to register mbochs_dev, err: %d", ret);return ret;}cdev_init(&led_dev.chrdev, &red_led_drv);//初始化字符设备结构体cdevcdev_add(&led_dev.chrdev, led_dev.dev_no, 1);//将已经初始化的字符设备结构体cdev添加到系统中 led_dev.led_class = class_create(THIS_MODULE, "breathing_light");//创建一个设备类(device class)并注册到内核中err = PTR_ERR(led_dev.led_class);if (IS_ERR(led_dev.led_class)) { goto failed1;} tdev = device_create(led_dev.led_class , NULL, led_dev.dev_no, NULL, "breathing_light"); //创建一个设备实例并注册到设备类中 if (IS_ERR(tdev)) { ret = -EINVAL;goto failed2;} printk(KERN_INFO"%s %s line %d", __FILE__, __FUNCTION__, __LINE__); return 0;failed2: device_destroy(led_dev.led_class, led_dev.dev_no); class_destroy(led_dev.led_class);failed1: cdev_del(&led_dev.chrdev);unregister_chrdev_region(led_dev.dev_no, 1); return ret;}int led_red_driver_remove(struct platform_device *dev){ // pwm_disable(led_dev.red_led_pwm); // pwm_free(led_dev.red_led_pwm); printk(KERN_INFO"driver remove %s %s line %d", __FILE__, __FUNCTION__, __LINE__); device_destroy(led_dev.led_class, led_dev.dev_no);class_destroy(led_dev.led_class);unregister_chrdev_region(led_dev.dev_no, 1); cdev_del(&led_dev.chrdev); return 0;}static struct platform_driver red_led_platform_driver = { .probe = led_red_driver_probe, .remove = led_red_driver_remove, .driver = { .name = "lhd,breathing_light_test", .owner = THIS_MODULE, .of_match_table = dts_match_table, //通过设备树匹配 },};module_platform_driver(red_led_platform_driver);MODULE_AUTHOR("LHD");MODULE_LICENSE("GPL");
将上述驱动编译为ko文件然后push进3588开发板里面
应用层程序
#include "stdio.h"#include < sys/types.h >#include < sys/stat.h >#include < fcntl.h >#include < unistd.h >#include < stdio.h >#include < string.h >#include < sys/ioctl.h >#include < poll.h >#include < stdint.h >#define DEV_NAME "/dev/breathing_light"#define LED_PWM_CMD_SET_DUTY 0x01#define LED_PWM_CMD_SET_PERIOD 0x02#define LED_PWM_CMD_SET_BOTH 0x03#define LED_PWM_CMD_ENABLE 0x04#define LED_PWM_CMD_DISABLE 0x05struct led_pwm_param { int duty_ns; int period_ns;};void sleep_ms(unsigned int ms){ struct timeval delay;delay.tv_sec = 0;delay.tv_usec = ms * 1000; select(0, NULL, NULL, NULL, &delay);}int main(int argc, char **argv){ int fd; int ret; /* 2. 打开文件 */fd = open(DEV_NAME, O_RDWR | O_NONBLOCK); // | O_NONBLOCKif (fd < 0){printf("can not open file %s, %d", DEV_NAME, fd);return -1;} int buf = 3;struct led_pwm_param led_pwm;led_pwm.duty_ns = 500;led_pwm.period_ns = 5000; write(fd, &led_pwm, sizeof(led_pwm)); sleep_ms(3000);while(1){if(led_pwm.duty_ns<=500){while(led_pwm.duty_ns< led_pwm.period_ns){ioctl(fd, LED_PWM_CMD_SET_DUTY, &led_pwm.duty_ns);sleep_ms(50);led_pwm.duty_ns += 300;}}else{while(led_pwm.duty_ns > 500){ioctl(fd, LED_PWM_CMD_SET_DUTY, &led_pwm.duty_ns);sleep_ms(50);led_pwm.duty_ns -= 300;}}}close(fd); return 0;}
使用3588自带的编译器将用户程序编译进开发板
prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc apptest_breathing_light_.c -o testpwm
adb push path/testpwm /userdata
chmod 777 testpwm
./testpwm
最后可以看到灯明灭交替的效果
审核编辑:汤梓红
标签:
电脑
-
ChatGPT原理是什么?ChatGPT对人类有哪些影响?
ChatGPT发布以来,就迅速火出了圈,相当对的用户都在下载体验,对这个很感兴趣,同时用户们对ChatGPT实...
-
ChatGPT是什么意思?ChatGPT国内能用吗?
ChatGPT是什么意思ChatGPT是聊天机器人。严格来说,这是一种基于openAI的大规模学习语言,基于接收到的...
-
word自动生成目录不全怎么办?mathtype如何嵌入到word中?
word自动生成目录不全怎么办word是通过识别标题的级别来自动生成目录的,如果部分标题未设置级别,就会...
-
夸克网盘的文件怎么保存到百度网盘?微软edge浏览器新功能怎么用?
夸克网盘的文件怎么保存到百度网盘很多小伙伴为了方便下载并保存自己组要得各种资源,会进行各类网盘的...
-
word设置图片环绕方式为四周型的方法有哪些?excel表格灰色不显示内容怎么办?
word设置图片环绕方式为四周型的方法word文档的丰富功能想必大家是有目共睹的,大家在使用Word文档编辑...
硬件
- 加热鼠标垫会不会导致键盘失灵?发热鼠标垫使用有哪些注意事项?
- 鼠标上的按键分别有什么功能?鼠标六个按键功能介绍
- 自己怎么组装电脑?需要哪些配件?
- 移动硬盘不识别怎么办?怎么解决移动硬盘不识别问题?
- 移动硬盘什么品牌质量最好?移动硬盘品牌推荐
- 有哪些便宜好用的机械键盘?机械键盘推荐
- 国产游戏手柄哪个牌子好?好用国产游戏手柄推荐
- 有哪些好用u盘推荐?u盘质量品牌排行榜前十名
- 怎么查看惠普笔记本是否支持SSD加速?有哪些方法?
- 联想tinkpad t410开机失败报错fan error怎么办?怎么拆机清理散热器?
- 笔记本电脑怎么样设置显卡硬件加速?主板加显卡可以提速吗?
- g3250和i33240哪个好?CPUG3250升级可以升级成什么?
- 华硕水立方装什么主板?华硕z590p主板可以装几张显卡?
- 七彩虹b560m主板带蓝牙吗?win10系统怎么连蓝牙低音炮?
- 天津夏季达沃斯论坛期间将举办主题城市论坛
- 关于铁路计次票、定期票 如何购买使用
- 天天讯息:老百姓的“柴米油盐”不易拍
- 【独家焦点】事关猴痘!广东疾控最新提醒
- sd卡坏了修复手机软件有什么方法
- 世界速读:如何避免dxgmms1.sys蓝屏问题
- 郑裕美、李善均恐怖悬疑新电影《梦游》,坎城首映后获外媒大赞 世界热头条
- 当前热文:外媒曝Jennie将加入漫威, 或出演亚洲超级英雄电影
- aw是什么意思(awd是什么意思)
- geya手表怎么调日期视频教程(geya手表) 今日热搜
- 相术小说神作(相术小说)-前沿资讯
- 身怀六甲k线图形(请问大家 在股市中 ldquo 身怀六甲出现 rdquo 走势 是什么意思)
- 割双眼皮失败怎么修复术_割双眼皮失败的表现
- 环球百事通!诛仙网游主播_诛仙网游
- 环球观热点:西科大高新学院播音主持怎么样_西科大高新学院
- 环球短讯!70天婴儿摇头怎么回事_婴儿摇头怎么回事
- 空难40天后,机上4名儿童在丛林被发现幸存,最小的只有11个月大
- 汇聚爱心 传递温暖-世界聚焦
- 团伙设下“首付购车”骗局,黄石两家4S店掉进陷阱
- 天天热消息:三人团伙流窜多省数次抢劫,潜江公安千里追缉将人抓获
- 环球热推荐:得不到就毁掉!租客拿到6万补偿后“毁坏式”退房 被判赔偿9万元!
- 国铁:今起12306试行在线选铺服务 想要下铺以后要拼手速啦!|全球最新
- 江苏考生最爱报哪个专业?去哪里上学?大数据分析报告来了! 天天视讯
- 中国吸引跨国公司的不单是大市场
- august的由来_augus
- 世界最资讯丨交规考试题型_交规考试模拟题
- ivms4200电脑客户端_ivms 4200
- 网上订花哪家好_网上订花哪个网站好 世界独家
- 健康到家,您今日饮咗未?
- 每日一猜6月10日:哪款能重塑眼镜人士新体验-世界新视野
- 环球要闻:社交综艺为何能成爆款
- 就离谱!甜妹竟然成了恶女标配?
- 当前简讯:法网女双历史性一刻!王欣瑜/谢淑薇进决赛,海峡组合冲冠有意义
- 真金不怕火炼!掘金3-1热火,NBA总冠军只差一步-全球快看点
- 24核M2 Ultra处理器性能跑分出炉 Intel与AMD笑了:苹果还嫩
- 天天信息:【夏收现场】 知识落“地”助丰收 耕地质量提升示范田小麦增产53.6%
- 浙江一铁路旁工厂起火逼停列车 现场黑烟滚滚火光冲天!所幸无伤亡!_看热讯
- 水淹道床影响列车运行!合肥发布情况通报
- 环卫母亲与高考儿子相拥而泣刷屏,普通人改变命运的努力打动人心
- 一季度600余家在华外资企业对多项营商环境指标满意度超80%
- dnf桃花特效下架了吗(dnf桃花特效)
- 每日看点!汽车票网上订票哪个软件比较方便(汽车票网上订票)
- 焦点消息!电影密钥是什么意思(密钥是什么)
- 什么癌症适合靶向药_哪些癌症适合靶向治疗-世界视点
- 治理脱发的药_治脱发药物有哪些-全球快消息
- 女性就业存在的问题及解决方法_女性便秘解决方法_当前热讯
- 为什么会胃疼而且想吐_胃疼恶心想吐怎么缓解
- 火车计次票、定期票 如何购买使用_全球时讯
- 当前关注:货车我私自报废了卖废铁了,现在挂户公司把告了
- 您好,2023.2.27我在一个网上购物平台买了一件物品,价值4-焦点速讯
- 拆迁房家庭成员都有分吗
- 福特:暂无计划终止福特电马赫公司业务运营
- 【速看料】广州市2023年普通高考感谢信
- 吃喝玩乐购!快来一站式畅享非遗购 探访非遗味 共赴非遗游!
- 全球观焦点:RK3588-Camera:MIPI-CSI调试之通路解析
- 天天快看点丨RK3588-MIPI屏幕调试笔记:RK3588-MIPI-DSI之屏参配置
- 【新时代新征程新伟业】乌鲁木齐市特色园区投资环境推介会举行 会上成功签约五个项目
- 【强信心 起好步 开新局】新疆糖酒会开幕 “新食力”引领“新食尚”_天天热点评
- 【绿水青山就是金山银山|践行绿色发展理念 建设生态美好家园】和平渠今日正式通水 水源属非接触性绿化及景观用水,不建议直接接触
- 【焦点热闻】“大市小集”,快闪店里有慢生活
- 2023高考今日落幕 多地公布志愿填报时间
- 天天速递!师生吃同锅菜要同价,并且可以互相选择才是真标准
- 要把算计代入婚姻,那也别怪对方魔高一尺道高一丈-今日观点
- 当前资讯!以前的食物,培育方法比较原始,没有那么多高科技手段
- 世界热文:《P3重制版》实体盘疑泄露:PS4/5和NS版也曝光!
- 聚焦:光线传媒董事长透露:动画电影《哪吒2》明年上映
- 全球信息:全国已收获冬小麦面积2.04亿亩——“三夏”机收快速推进
- 【环球报资讯】2022年全国住房公积金发放个人住房贷款超一万亿元
- 从一封未刊信札看董每戡在长沙的朋友圈 今日热议
- 当前热讯:如何促进新型研发机构高质量发展?广州这样做
- 美债野蛮生长 国防开支节节攀升
- 老河口:蓝莓成熟季 等你来采撷
- 天天讯息:微软准备在加拿大新建实验室,将配备公司在中国和世界各地的AI专家
- 世界今亮点!中国商飞:加快形成独立自主的研制能力、生产能力
- 中超泰山队客场1-1三镇,克雷桑扳平比分,费莱尼下轮停赛|天天观天下
- 世界要闻:高考落幕——
- 实时焦点:cpu蓝屏怎么解决
- 华硕BIOS修复蓝屏解决方法需要哪些步骤-天天观热点
- 世界今日讯!思明区政务服务中心“政务智能办”专区启用
- 市质检院研发项目有新进展 LED行业标准修订获工信部立项
- 世界今热点:黄梅环保部门开展“静音降噪”行动
- 黄冈市妇幼保健院获首批国家级婚前保健特色专科建设单位 全球快看
- 天天速递!这就是信心|优化营商环境 各地硬招、实招频出
- 环球热头条丨第12届金交会开幕,现场签约总金额超3500亿元
- 全球今热点:江阴本土儿童剧《今天我是升旗手》全国展演
- C视频丨四川这4个项目,谁最有可能冲刺世界文化遗产?丨文化和自然遗产日
- 我是大运火炬手丨邓亚萍:希望大家享受体育带来的健康和快乐 环球微资讯
- C视频丨四川这5处世界遗产,你打卡过几个?丨文化和自然遗产日_当前消息
- 天天速读:黄瓜汁怎么榨好喝儿童(黄瓜汁怎么榨好喝)
- 小洗衣机什么牌子最好(儿童洗衣机什么牌子好)_天天播报
- 全球新消息丨200多分的专科学校辽宁(200多分的专科学校)
- 10寸平板电脑尺寸对照表图片(10寸平板电脑尺寸)_今日要闻
- 嘴里长智齿疼怎么办(长智齿疼怎么办)
- 繁花嫩叶的意思在《春》(繁花嫩叶的意思)
- 狂犬病的早期症状(狂犬病的前兆)-每日播报
- 世界热点评!年夜饭菜谱大全20道素菜(年夜饭菜谱)
- 从8000年前的刻符龟甲说起 成博新展用220件重磅文物解读“汉字中国”|文化和自然遗产日
- 【世界速看料】头狼:黄金下周1970-73区域布局空
- 《底特律》发行商公布独立品牌:三款游戏待发售|当前快报
- 每日精选:最美童星长大后惊艳全网!16岁时因“不够性感”被导演刷掉,她霸气怒怼:恶心的猪!

电竞

数码

事件
- 世界微头条丨RK3588开发板(armsom-w3)之PWM实操06-11
- 国家乡村振兴局开展农村厕所革命“提质年”|头条06-11
- 世界今头条!途家网怎么样(途家网)06-11
- 豆豉怎么读音是什么_豆鼓怎么读06-11
- 云集美股涨14.51%06-11
- 焦点简讯:苹果M2 Ultra在Geekbench 5跑分并没有碾压英特尔、AMD,还不如i9-13900K06-11
- 上海海港排名榜首,主教练为何被喊下课?06-11
- 学制苗族银饰 传承非遗之美06-11
- 【聚看点】菲律宾马荣火山喷发风险上升 阿尔拜省宣布进入灾难状态06-11
- 【全球热闻】dnf拍卖行打不开了_dnf拍卖行打不开06-11
- 赶紧转给爸妈!陕西警方紧急预警! 天天时快讯06-11
- lost one的号哭画师是谁(lost one的号哭) 环球热讯06-11
- 半自助火锅,三位份为什么不能四个人一起吃|全球最资讯06-11
- 环卫母亲与高考儿子相拥而泣刷屏,普通人改变命运的努力打动人心06-11
- 吴怡农为父13年前性骚女大学生发声,网友不禁脱口1字-天天资讯06-11