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
最后可以看到灯明灭交替的效果
审核编辑:汤梓红
标签:
推荐
财富更多》
-
手握60亿元人参却发不出工资,“人参之王”咋啦?
手握60亿元人参却发不出工资,“人参之...
-
热威电热过会:今年IPO过第143家 海通证券过11.5单_当前速讯
热威电热过会:今年IPO过第143家海通证...
-
世界消息!正恒动力过会:今年IPO过关第145家 东吴证券过5单
正恒动力过会:今年IPO过关第145家东吴...
-
润际新材过会:今年IPO过关第144家 长江保荐过4单
润际新材过会:今年IPO过关第144家长江...
-
环球动态:斗鱼美股跌6.48%
斗鱼美股跌6 48%---中国经济网北京6月1...
动态更多》
热点
- realme10系列正式宣布 采用双曲面屏正面顶部居中挖孔
- 五菱全新微型电动车内饰官图发布 座椅采用星际形打孔工艺
- 努比亚Z40星空典藏版正式开售 采用微米级油画笔触纹理技术
- iQOO11系列正式官宣 首批搭载骁龙8Gen2机型之一
- 海信34英寸带鱼屏显示器发布 支持165Hz刷新率
- OPPO明年将商用240W超级闪充 新一代电芯支持更高倍率充电
- 第一款Android手机渲染图曝光 横向滑盖设计和全尺寸键盘
- 吉利首款纯电皮卡11月9日上市 车辆续航里程超过610公里
- 努比亚Z40SPro星空典藏版正式公布 堪称窄边框天花板
- vivo无线运动耳机2今日正式上市 首销只要119元
- 润际新材过会:今年IPO过关第144家 长江保荐过4单
- 面积最大的国家是哪个_面积最大的国家
- 【快播报】马斯克:推特将向创作者支付回复中的广告费用
- 手握60亿元人参却发不出工资,“人参之王”咋啦?
- 天天快资讯:上午9点,球王来了!梅西抵达北京,第7次来中国,却无缘交手国足
- 世界消息!正恒动力过会:今年IPO过关第145家 东吴证券过5单
- 四川一中学不让学生带书离校售卖,“校内3毛/斤,校外6毛/斤”,县教育局回应 世界视讯
- 遇见尼山之美|在尼山,传统文化超有趣!
- “标准化”赋能绿色低碳发展 2023青岛国际标准化大会启幕
- 前5个月我国完成水利建设投资逾4100亿元 同比增长32.1%_焦点信息
- 观察:电影《天空之城》重映票房破1亿
- 被蚊子咬后第一件事做什么?99%的人都搞错了......
- 社区课堂学会手机导航、预约看病
- 逛山东预制菜精品展需要带着什么?
- 全球焦点!刘国梁提拔8人入围国家队,15岁小张怡宁入选,陈幸同王一迪师妹
- 热威电热过会:今年IPO过第143家 海通证券过11.5单_当前速讯
- 梦想中的同事!乒乓球选手陈梦在海信新风空调正式入职?
- 法网综合 | 阿尔卡拉斯意外抽筋 焦科维奇晋级决赛
- 观点:青龙图腾淮上讲的什么(青龙图腾谁先喜欢谁)
- 得不到就毁掉!租客拿到6万补偿后“毁坏式”退房 被判赔偿9万元!
- 全球今亮点!追光 | 明晨,看18年后的伊斯坦布尔续写欧冠决赛传奇
- 22岁女孩拿快递失联已第9天 她是家里顶梁柱!此前地毯式搜寻无果!
- 肌酐高吃什么能降下来(肌酐高可以吃哪些水果来降肌酐?)|快播报
- 约基奇23+12戈登27分 掘金力克热火3-1夺冠军点 当前快播
- 每日快报!王力宏方发声否认李靓蕾在美国胜诉
- 乐平:科技大棚 增产增收 当前信息
- 全球短讯!杭州小学生查“学习资料”,一下花掉妈妈10万元...紧急提醒!
- Zen5加持!AMD锐龙8000桌面APU曝光:集显把入门卡虐成炮灰 当前资讯
- 世界动态:做醪糟用什么米(做醪糟用什么米)
- 世界百事通!德云社违反卫生管理, 未取得卫生许可证被罚3万
- 湖北省地方金融监督管理局党组书记、局长段银弟接受审查调查
- 谢晖或遭足协追罚?怒怼球迷可以理解,大连足球底蕴已丧失殆尽
- 焦点消息!青龙图腾淮上讲的什么(青龙图腾谁先喜欢谁)
- 日本推出知识产权推进计划 将探讨生成式 AI 必要管理的措施
- OpenAI首席执行官同韩总统会面:建议韩国增加系统芯片产能 放宽规制营造AI生态系统
- “高考劣质笔”事件内情 短讯
- 欧阳靖维护欧阳娜娜:跟她合作绝对是我的荣幸
- 延安市人民医院顺利完成2023年医师资格实践技能陕北片区考试任务
- 机会仅一次!曝皇马对凯恩下最后通牒:施压热刺,降5000万来投
- AI前哨 | Open AI联合创始人Sam AItman:目前开源不是最佳路径-全球微动态
- 虞书欣方否认与吴建豪恋情:不再陷入自证危机
- 新突破、国际首次 中国科学技术领域成果频出 当前热闻
- 世界报道:长安大学学子以“三色”模式助力陕西乡村振兴
- 世界热点!极目时评丨环卫母亲与高考儿子相拥而泣刷屏,普通人改变命运的努力打动人心
- 2023中国(山东)消费品供应链生态大会在济隆重举行|当前资讯
- 焦点信息:沃格尔:执教杜兰特和执教詹姆斯很相似 那是一种合作关系
- 英伟达人工智能软件存在安全漏洞 可被操控泄露个人信息
- 热点聚焦:苹果Epic对决或重燃:双方均申请重新审议判决
- “牵手门”连衣裙月销4000+ 卖家呼吁理性消费!
- 年内定增募资排行榜:7家公司募资超百亿元
- 《潜行者2》确认不参加6月的Xbox发布会
- 回归广东,28岁林高远上任新岗位,提拔亮相,王皓马琳送祝福_世界看热讯
- 中国5月狭义乘用车零售预计达173.0万辆 新能源车销量达58.0万辆
- 当前热点-陕西发布高校毕业生就业创业政策服务指南
- 数字化是方向——打造数字孪生是谋划县乡发展的现实契机(十九)
- 世界微速讯:昔日荒山变为幸福“金山” 桃园变成农民增收“致富园”
- 罗马尼亚vs斯洛文尼亚时间?
- 天天微速讯:扎克伯格评苹果MR新品:价格是自家产品的7倍 但没看到什么突破
- 微速讯:宋奇英
- 红宝石电解电容_康富松电解电容
- 各地税务部门不断优化服务 前5个月新办涉税经营主体643.5万户
- 环球今热点:高考结束,河南多家景区发布免票、优惠政策
- 苹果的定位服务有什么用_苹果定位服务有什么用简介介绍 全球微头条
- 每日视讯:10度穿什么衣服男_10度穿什么
- 科三考试灯光操作语音播报_科三考试灯光操作
- 天天动态:本赛季季后赛至今波普总共代表掘金出场18次
- 中国平安运动意外险怎么样?怎么买?
- 世界今亮点!意外险需要什么材料去报销?报销比例是多少?
- 最新:夜幕下,一个群体带动城市消费新热潮
- 一周钢厂动态汇总(6月5日-6月9日)|世界独家
- 当前消息!搜救犬被确诊淋巴瘤晚期,主人带它最后一次出门,小镇居民集体出动陪它散步向它告别
- 历时100天,180余项活动陆续开展,长春消夏艺术节盛大启幕
- 斗罗:史莱克四美都美出新高度,唐三和小舞结婚一吻,也太甜了_今日快看
- 长春经济圈环线高速项目再获新突破_世界聚焦
- 信通万物 提质赋能——第31届中国国际信息通信展览会观察 当前聚焦
- 经济日报金观平:中国吸引跨国公司的不单是大市场
- 【焦点热闻】西安高新区2023“文化和自然遗产日”主题活动启动
- IDC:联想服务器连续三季度全球第三_环球今日讯
- 全球通讯!多措并举促进应届高校毕业生就业 网络招聘活动忙
- 每日快看:新突破、国际首次 中国科学技术领域成果频出
- 夜幕下,一个群体带动城市消费新热潮
- 冬天的花有哪些?你都见过吗?
- 关于铁路计次票、定期票 如何购买使用
- 沃格尔:未来几年我们都可以去争冠 这是太阳最好的时代_天天速看料
- 国产榴莲要来了!海南首批国产榴莲预计6月上市_天天快资讯
- 陕西西安推动“十里沣河”文旅深度融合 古老沣河涌动新活力-全球观点
- 全球短讯!暗黑4专注之威能介绍
- 当前视讯!这个小城培育发展新业态 “平罗八点半”夜经济启动
- 血腥风格银河恶魔城新作《Cookie Cutter》实机预告赏
- 暗黑4稳压威能介绍 焦点精选
- 前五个月全国累计新办涉税经营主体643.5万户
- 当前滚动:八村塁要8000万加首发位置 不保证续约湖人 离开詹姆斯打快乐篮球
- 首发价39999元 三星发布98英寸Q80Z巨幕电视:送电视、手机 当前要闻
- 广州市2023年普通高考感谢信 焦点热门
- 【文体市场面面观】“两个效益”彰显文化企业使命担当
- 中经评论:以“村BA”点燃乡村活力_天天观点
- 国产最大盾构主轴承“破壁者”面世
- 苍穹巨灵·内蒙古篇 看点
- 环球动态:斗鱼美股跌6.48%
- 无锡堰桥:驰而不息 绘就“人水和谐”新图景
- 这一哭 全世界都对不起她了?
- 焦点快报!排列三2023151期渔王网三预测
- 哈维尔被喊下课却获海港内部力挺:我们很有凝聚力 环球头条
- 观焦点:名宿:国米具备战胜曼城所需的所有素质,小因的战术克制瓜迪奥拉
- 金山云美股涨7.72%-环球热文
- 今日热讯:中方驳斥:无中生有、信口雌黄、恶意诋毁!
- 专访《米体》王牌记者:国米拿什么击败曼城?|全球视讯
- 中国商业航天发展大会聚焦商业航天产业发展
- 2023款全新瑞迈重塑入门级皮卡天花板,江西五十铃产品线焕新再出王牌
- 2023款全新瑞迈重塑入门级皮卡天花板,江西五十铃产品线焕新再出王牌
- 谷歌钱包超越苹果钱包了吗?3项很酷的新功能反杀
- 最后三天!魅族无界即将降临,行业外观的新标杆来了
- 世界速读:金观平:中国吸引跨国公司的不单是大市场
- 全国已收获冬小麦面积2.04亿亩——“三夏”机收快速推进 每日热议
- 西藏实施质量强区战略-视讯
- 【天天播资讯】认准这些高校!2023年山东具有普通高等学历教育招生资格高校名单
- 【文体市场面面观】“两个效益”彰显文化企业使命担当 每日消息
- 天天要闻:进一步提振民间投资信心
- 快来参与!2023年“好网民·在淄博”优秀故事开始征集!
- 今起,12306上线新功能!|环球热议
- 微软、谷歌测试人工智能搜索广告的策略激怒广告主
- 政府专项补贴会计分录(收到政府补贴会计分录)|焦点播报
- 当前头条:大林寺桃花拼音版带拼音(大林寺桃花拼音版)
- 资讯:科学排雷 | 近视了戴眼镜,度数会加深吗
- 速讯:名义利率实际利率计算(名义利率和实际利率的区别)