RK3588开发板(armsom-w3)之PWM实操
RK3588开发板(armsom-w3)之PWM实操
2023-06-10PWM信号由一个固定频率的周期性脉冲序列组成,每个脉冲的宽度(持续时间)可以根据需要进行调节。调节脉冲宽度的比例可以改变平均电压或电流的大小,从而实现对设备的控制。
当谈论PWM时,以下三个关键术语经常被提及:
频率(Frequency):PWM信号的频率是指每秒钟内脉冲的数量。
(资料图片)
周期(Period):PWM信号的周期是指一个完整脉冲序列所花费的时间。它是频率的倒数,以秒为单位表示。周期可以通过将频率的倒数计算得到,例如,一个10kHz的PWM信号的周期为0.1毫秒(100微秒)。
占空比(Duty Cycle):占空比是指PWM信号中脉冲宽度与周期之间的比例关系。它表示了脉冲在一个周期中所占据的时间比例,通常以百分比表示。占空比为0%意味着脉冲不存在(完全低电平),而占空比为100%表示脉冲持续时间占据了整个周期(完全高电平)。在实际应用中,占空比可以在0%到100%之间任意调整,以实现所需的控制效果。
pwm驱动是一个通用的驱动,SOC厂家都会在SDK里面默认打开
驱动文件所在位置:
drivers/pwm/pwm-rockchip.c
默认SDK已经加载好了PWM的驱动,下文我们主要注意PWM怎么使用
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 提供了用户层的接口,在 /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是比较常见的,比如风扇电机控制,电视背光控制, 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
最后可以看到灯明灭交替的效果
审核编辑:汤梓红
标签:
RK3588开发板(armsom-w3)之PWM实操
2023-06-10
近年来,随着显卡性能的提升,对显卡厂商在供电和散热等方面的要求也越
2023-06-10
荆楚网(湖北日报网)讯(通讯员龚朝辉)6月7日,笔者从黄冈市生态环境
2023-06-10
6月10日电,俄罗斯旅游协会发布消息称,距俄罗斯和中国恢复旅行团免签
2023-06-10
1、主演:翁莎功·波拉玛塔功、沃拉娜特·旺萨莞2、是一部由NewWongsako
2023-06-10
NBA总决赛第4场结束,掘金队已经取得了3-1的领先,距离夺冠只有一步之
2023-06-10
6月9日,以“汇聚金融新力量赋能高质量发展”为主题的第12届中国(广州
2023-06-10
9日,大唐西藏扎拉水电站主体工程正式开工建设,项目配备首台套50万千
2023-06-10
正义网北京6月10日电(见习记者徐晴子李佳慧)以亲友关系为组合纽带,跨区
2023-06-10
5月25日至5月28日,在Netflix通知100多个国家和地区的用户其将实行打击
2023-06-10
1、learn这个词你知道吧,也知道怎么读吧,它是学习的意思那么。2、这
2023-06-10
月10日消息,苹果在WWDC2023开发者大会期间,其中一场PlatformsStateof
2023-06-10
5月23日,日本出台针对23种半导体制造设备的出口管制措施。5月26日,日
2023-06-10
春天在哪里、世上只有妈妈好、粉刷匠、娃哈哈、小小少年、马兰花、丢手
2023-06-10
1、用淘米水来洗芋头,用一塑料袋装上芋头后,将淘米水放入装芋头的塑料
2023-06-10
9日,国际葡萄与葡萄酒产业大会、第三届中国(宁夏)国际葡萄酒文化旅
2023-06-10
如何保护墓葬壁画?敦煌研究院院长揭秘关键技术
2023-06-10
albo1125 common dll是一款Windows系统中必备的动态运行文件。如果在运
2023-06-10
京东京喜代运营是指代理商通过京东京喜平台进行商品推广、销售、售后等
2023-06-10
形如玫瑰的结石你见过吗?近日台州一位名叫李红(化名)的女子在医院接
2023-06-10
6月9日,武汉发布武告字(2023年)8号拍卖公告,此次共出让21宗地块,
2023-06-10
股票市场是已经发行的股票转让、买卖和流通的场所,包括交易所市场和场
2023-06-10
1、品牌介绍:诞生于1980年,是日本流行的电解质补充饮料品牌。波卡里
2023-06-10
6月6日,*ST蓝光从A股摘牌,从上市到退市只有短短的八年。*ST蓝光的八
2023-06-10
泉州市再获民间捐赠“迁台记忆”档案资料“6·9”国际档案日,100本泉
2023-06-10
6月9日北向资金减持37 0万股邮储银行(01658 HK)。近5个交易日中,获
2023-06-10
6月9日北向资金增持2 15万股长江基建集团(01038 HK)。近5个交易日中
2023-06-10
1、二胡品牌有哪些?二胡哪个牌子好?二胡什么牌子好?买二胡千万一定要注
2023-06-09
1、Finally;So consequently therefore inconsequence inconseq
2023-06-09
中国教育报-中国教育新闻网讯(通讯员黄宇莹李谌涵记者阳锡叶)“科院
2023-06-09
为健全资本市场财富管理功能,培育市场买方中介队伍,证监会起草《公开
2023-06-09
极目新闻记者卢成汉通讯员冯夏雪王诗敏“真的很感谢你们,经过这一次教
2023-06-09
1、刺绣[Xi]2、中国传统手工艺品之一。用各种针迹的彩色线在织物上绣出
2023-06-09
9日,浙江武义。一片池塘里,并蒂莲和同心莲同框了!罕见的十万分之一
2023-06-09
1、《王姣鸾百年长恨》中就记有这样一则故事:小姐在后园荡秋千,不小心
2023-06-09
作为成都最为繁华的商圈之一,太古里深受年轻人喜爱,也是不少外地游客
2023-06-09
1、其实很多交响乐中的慢板乐章都有葬礼进行曲这个名字,就如最著名的
2023-06-09
1、各组四强那英:陈冰、李嘉格、张碧晨、刘明湘预计:张碧晨vs刘明湘
2023-06-09
今天小编宋丹来为大家解答以上的问题。宪法规范作用的主要方式,简答题
2023-06-09
今天小编岚岚来为大家解答以上的问题。怎么清理电脑的内存容量,如何清
2023-06-09
1、可能是服务器在更新或者是帐号关系。2、解决方法方法如下:当我们打
2023-06-09
普拉提在中国已经不算一个陌生词汇,捕获了从舞台上明星到广场舞阿姨的
2023-06-09
中新网河南新闻6月9日电(杨大勇姜培培)“这是我第三次入住云上院子,摇
2023-06-09
多地探索“妈妈岗”减轻生育负担专家建议改为“亲子岗”---3年多以前,
2023-06-09
近日,我省印发《关于全面加强新形势下森林防灭火工作的实施方案》(简
2023-06-09
2023年6月8日谣言:天津、安徽等地有考生“骆X文”丢失准考证?真相:
2023-06-09
崩坏星穹铁道对新手玩家非常不友好,其中崩坏星穹铁道冬城博物珍奇簿活
2023-06-09
想要在游戏中变得更强,那么就需要玩家有强大的游戏理解能力和毅力。暗
2023-06-09
证券时报网讯,Wind统计显示,截至6月8日,共有1252只个股获陆股通增仓
2023-06-09
截至2023年6月8日收盘,神工股份(688233)报收于34 69元,下跌4 72%,换
2023-06-09
*ST天山公告,公司5月销售活畜313头,销售收入473 64万元,环比变动分
2023-06-09
监管出手!多家券商和明星分析师被点名中国基金报晨曦又有一大波券商及
2023-06-09
作为20-25万级别SUV新标杆的零跑C11,不仅具备低用车成本和卓越的纯电
2023-06-09
眼下,豫东豫北小麦展开大规模机收,河南各级农机部门优化农机调度流程
2023-06-09
来为大家解答以上的问题。石家庄中考录取通知书什么时候收到,石家庄中
2023-06-09
来为大家解答以上的问题。卡尺怎么看尺寸视频,卡尺怎么看这个很多人还
2023-06-09
荣盛发展(SZ002146,收盘价:1 17元)6月8日晚间发布公告称,公司于20
2023-06-09
小伙伴们,你们好,今天小夏来聊聊一篇关于鲁昊上城,关于鲁昊上城简述
2023-06-09
莫拉塔和迪巴拉这两位前尤文图斯球员之间有着美好的关系。事实上,作为
2023-06-09
新劲刚:股东拟减持不超过1 69%公司股份
2023-06-09
莫拉塔的小女儿贝拉在今年1月出生,而迪巴拉和女友奥莉安娜分别担任贝
2023-06-09
石榴云 新疆日报讯(记者曹华报道)记者从自治区林业和草原局获悉,近
2023-06-09
1、考单招做什么题好单招考试刷题练有用。在单招考前这短暂的时间内,
2023-06-09
2023年5月31日,“节能出行E动奔腾”一汽奔腾NAT节能挑战赛青岛站圆满
2023-06-09
MySQL连接的使用在前几章节中,我们已经学会了如何在一张表中读取数据
2023-06-09
罗汉果花的功效与作用,吃了之后有什么好处很多人还不知道,现在让我们
2023-06-09
今天,是高考的第一天。相信见过高考试卷的人都会注意到,每一份高考试
2023-06-09
6类非屏蔽双绞线,类非屏蔽双绞线的基本详情介绍很多人还不知道,那么
2023-06-09
今日辟谣(2023年6月8日)2023年6月8日谣言:天津、安徽等地有考生“骆
2023-06-08
北京时间6月9日19:35,大连人主场迎战北京国安,这场比赛,目标是拼一
2023-06-08
普通百姓家庭,需要储备多少现金合适?答案来了,现金,存款,手机,交易,
2023-06-08
IT之家6月8日消息,微软已经于今年1月10日正式结束了Windows8 1操作系
2023-06-08
6月8日,六大国有行宣布统一下调各类型存款利率,涉及人民币、美元币种
2023-06-08
“从之前的浑浊腥臭,到如今的清清河湾、绿意蔓延,这5年的改造终于有
2023-06-08
唐德影视:股东吴宏亮计划减持公司股份不超过2 04%,持股,股权,吴宏亮,
2023-06-08
智通财经APP讯,保利发展(600048 SH)发布公告,自公司《关于本公司获得
2023-06-08
部分省份今天下午结束高考,6月下旬陆续公布成绩
2023-06-08
学生在学校里用电脑上网,一般都是连接校园网。但很多同学在升级了Win1
2023-06-08
1、安徽信发齿轮机械有限公司于2006年12月28日成立。2、法定代表人张根
2023-06-08
智通财经APP讯,中文在线(300364)(300364 SZ)披露2023年度向特定对象发
2023-06-08
1、电池冲不了电,尝试以下方法: 断开电源,间断按电源键3到5次,
2023-06-08
人民银行:积极践行绿色发展理念促进30 60目标平稳实现---这是一场广泛
2023-06-08
广阔无垠的海洋,是人类发展的“宝库”,海洋不仅为我们提供丰富的资源
2023-06-08
“家长们辛苦了!佳尔尼家政服务中心免费为家长和考生提供休息场所及茶
2023-06-08
河南2023年卫生资格考试查分入口已开通,请考生登录国家卫生健康委人才
2023-06-08
1、珠海中考以后用什么卷考生填报志愿前,各级招生考试部门和有关学校应
2023-06-08
*灵感来自泰拉瑞亚Calamitymod(灾厄),近战武器“银河”。“仰望星河
2023-06-08
1000 7万!刚刚,《原神》微博粉丝数突破了千万大关。这可能比大多数人
2023-06-08
暗黑破坏神4世界boss5月刷新时间::2:00-2:15、4:00-4:15、14:00-14:1
2023-06-08
云顶之弈s9赛季拼多多枪手阵容怎么搭配?新赛季中加入了新的棋子和羁绊
2023-06-08
海豚君说过,走出疫情后,携程的投资机会主要在于看三大逻辑的落地进展
2023-06-08
三国时期,有关东吴的五个冷知识,知道一个就是高手!,三国时期恐怕是
2023-06-08
河失镇吹响镇域河道汛期前安全清障集结号随着夏季汛期即将到来,泰兴市
2023-06-08
“樱桃好吃树难栽,不下苦功花不开。”这是我们常听到的一句谚语,而这
2023-06-08
商品经济产生的经济条件,商品经济产生的条件这个很多人还不知道,现在
2023-06-08
6月7日,彩虹股份(600707)融资买入416 89万元,融资偿还174 3万元,
2023-06-08
——《正红旗下》情境音乐会北京首演2023年6月6日19:30,《正红旗下》
2023-06-08
恒指涨0 8%,恒生科技指数涨2 26%。长城汽车、快手涨超4%,网易、理想
2023-06-08
奇丽,汉语词汇。拼音:qílì释义:奇特而美丽出处:这种境界,既使人
2023-06-08
想必现在有很多小伙伴对于氯水的化学式方面的知识都比较想要了解,那么
2023-06-08Copyright © 2015-2022 亚太水产网版权所有 备案号:沪ICP备2020036824号-11 联系邮箱: 562 66 29@qq.com