社区首页
技术讨论创新帖
全部新帖
资料区
社区活动
联系管理员
★ 社区积分制度
★ 新手必读
★ 申请版主★
请
登录
后使用快捷导航
没有帐号?
注册
首页
|
电子技术
|
嵌入式
模拟电子
单片机
电源管理
传感器
半导体
电子应用
|
工业控制
物联网
汽车电子
网络通信
医疗电子
手机便携
测试测量
安防电子
家用电子
机器人
新能源
电子头条
|
社区
|
论坛
测评
博客
大学堂
|
下载
|
下载中心
电路图
精品文集
电路图
|
参考设计
|
Datasheet
|
活动
|
直播
datasheet
datasheet
文章
搜索
登录
注册
中文
En
论坛
切换旧版
电子工程世界-论坛
»
论坛
›
电子技术交流
›
国产芯片交流
›
全志模块设备开发之PWM编程基础介绍
返回列表
发新帖
回复
阅
669
|
回
0
aleksib
当前离线
纯净的硅(中级)
最后登录
2025-1-6
在线时间
40 小时
威望
998分
芯积分
511分
(兑换)
E金币
0枚
(兑换)
(兑换)
好友
0
aleksib
287
帖子
0
TA的资源
纯净的硅(中级)
+ 好友
私信
楼主
发表于2024-8-5 13:43
只看该作者
全志模块设备开发之PWM编程基础介绍
[复制链接]
## 11.1 PWM概述 PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%。是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。 ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](http://photos.100ask.net/NewHomeSite/PWM_image1.jpg) PWM信号把模拟信号转化为数字电路所需要的编码,现在基本是采用数字电路,因此在很多场合都采用PWM信号,我们经常见到的就是交流调光电路,也可以说是无级调速,高电平占多一点,也就是占空比大一点亮度就亮一点,占空比小一点亮度就没有那么亮,前提是PWM的频率要大于我们人眼识别频率,要不然会出现闪烁现象。除了在调光电路应用,还有在直流斩波电路、蜂鸣器驱动、电机驱动、逆变电路、加湿机雾化量等都会有应用。 ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](http://photos.100ask.net/NewHomeSite/PWM_image2.jpg) ### 11.1.1 PWM的参数说明 https://www.kernel.org/doc/Documentation/pwm.txt **period** PWM信号的总周期(读/写)。 值以纳秒为单位,是活动和非活动的总和 PWM的时间。 **duty_cycle(占空比)** PWM信号的有效时间(读/写)。 值以纳秒为单位,且必须小于周期。 在NORMAL模式下,表示一个周期内高电平持续的时间 在INVERTED模式下,表示一个周期中低电平持续的时间 **polarity** 改变PWM信号的极性(读/写)。 写入此属性仅在PWM芯片支持更改时才有效 极性。只有PWM不能改变极性 启用。值是字符串“normal”或“inversed”。 **enable** 启用/禁用PWM信号(读/写)。 * 0 - 禁用 * 1 - 启用 ## 11.2 用户层查看PWM 如果在内核配置中启用了CONFIG_SYSFS,则会提供一个简单的sysfs接口来使用用户空间的PWM。它在/ sys / class / pwm /中公开。每个被探测的PWM控制器/芯片将被输出为pwmchipN,其中N是PWM芯片的基础。你在目录里面会发现: ```c 1 echo 0 > /sys/class/pwm/pwmchip0/export /*设置PWM4输出,调出pwm0目录下设备节点,用于以下配置 */ ``` ```c 2 echo 1000000 >/sys/class/pwm/pwmchip0/pwm0/period /*设置PWM4一个周期的持续时间,单位为ns,即1K Hz */ ``` ```c 3 echo 500000 >/sys/class/pwm/pwmchip0/pwm0/duty_cycle /*设置一个周期中的”ON”时间,单位为ns,即占空比=duty_cycle/period=50% */ ``` ```c 4 echo 1 >/sys/class/pwm/pwmchip0/pwm0/enable /*设置PWM4使能 */ ``` ## 11.3 PWM的SYSFS使用 ```c #include
#include
#include
#include
#include
#include
#include
#include
#include
#define dbmsg(fmt, args ...) printf("%s[%d]: "fmt"\n", __FUNCTION__, __LINE__,##args) #define DUTY "duty" #define PERIOD "1000000" #define DUTYCYCLE "500000" #define LENGTH 100 int fd_period = 0,fd_duty = 0,fd_enable = 0,duty_m = 0; int usage() { printf("usage:\n"); printf("./pwm-sysfs-test duty <0/1> : 0-->static; 1-->dynamic \n"); return 0; } int pwm_setup() { int fd,ret; fd = open("/sys/class/pwm/pwmchip0/export", O_WRONLY); if(fd < 0) { dbmsg("open export error\n"); return -1; } ret = write(fd, "0", strlen("0")); if(ret < 0) { dbmsg("creat pwm0 error\n"); return -1; }else dbmsg("export pwm0 ok\n"); fd_period = open("/sys/class/pwm/pwmchip0/pwm0/period", O_RDWR); fd_duty = open("/sys/class/pwm/pwmchip0/pwm0/duty_cycle", O_RDWR); fd_enable = open("/sys/class/pwm/pwmchip0/pwm0/enable", O_RDWR); if((fd_period < 0)||(fd_duty < 0)||(fd_enable < 0)) { dbmsg("open error\n"); return -1; } ret = write(fd_period, PERIOD,strlen(PERIOD)); if(ret < 0) { dbmsg("change period error\n"); return -1; }else dbmsg("change period ok\n"); ret = write(fd_duty, DUTYCYCLE, strlen(DUTYCYCLE)); if(ret < 0) { dbmsg("change duty_cycle error\n"); return -1; }else dbmsg("change duty_cycle ok\n"); ret = write(fd_enable, "1", strlen("1")); if(ret < 0) { dbmsg("enable pwm0 error\n"); return -1; }else dbmsg("enable pwm0 ok\n"); duty_m = atoi(DUTYCYCLE)/2; printf("duty_m: %d \n",duty_m); return 0; } int main ( int argc, char *argv[] ) { int ret; int num; if(argc < 2) { usage(); return -1; } if(strncmp(argv[1],DUTY, sizeof(DUTY)) == 0) { dbmsg("%s", DUTY); if(argc != 3) { usage(); return -1; } pwm_setup(); } return 0; } ``` ## 11.4 PWM应用编程 The main useful user API are the following: devm_pwm_get() or pwm_get() / pwm_put(): this API is used to look up, request, then free a PWM device. pwm_init_state(),pwm_get_state(), pwm_apply_state(): this API is used to initialize, retrieve and apply the current PWM device state. pwm_config(): this API updates the PWM device configuration (period and duty cycle). ### 11.4.1 修改设备树 ```c beeper { compatible = "pwm-beeper"; pwms = <&pwm 0 1000000 0>; pinctrl-names = "default"; pinctrl-0 = <&pwm0_pin>; }; ``` ### 11.4.2 修改配置文件 ```c Activate PWM framework in the kernel configuration through the Linux menuconfig tool, Menuconfig or how to configure kernel (CONFIG_PWM=y): Device Drivers---> [*] Pulse-Width Modulation (PWM) Support---> ``` ### 添加驱动 ```c #include
#include
#include
#include
#include
#include
//#include
#define PWM_ON0x100001 #define PWM_OFF 0x100002 struct pwm_device *pwm_dev_2; struct pwm_device *pwm_dev_3; static long pwm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int ret; switch(cmd) { case PWM_ON: ret = pwm_config(pwm_dev_2,200000,500000); if(ret < 0){ printk("pwm_dev_2 ioctl fail"); return 0; } ret = pwm_config(pwm_dev_3,300000,500000); if(ret < 0){ printk("pwm_dev_3 ioctl fail"); } pwm_enable(pwm_dev_2); pwm_enable(pwm_dev_3); break; case PWM_OFF: ret = pwm_config(pwm_dev_2,0,500000); if(ret < 0){ printk("pwm_dev_2 ioctl fail"); return 0; } ret = pwm_config(pwm_dev_3,0,500000); if(ret < 0){ printk("pwm_dev_3 ioctl fail"); } pwm_disable(pwm_dev_2); pwm_disable(pwm_dev_3); break; } return 0; } //定义初始化硬件操作方法 static struct file_operations pwm_fops = { .owner = THIS_MODULE, .unlocked_ioctl = pwm_ioctl }; //定义初始化混杂设备对象 static struct miscdevice pwm_misc = { .minor = MISC_DYNAMIC_MINOR, //动态分配次设备号 .name = "mypwm", //dev/mypwm .fops = &pwm_fops }; static int pwm_init(void) { int ret; printk("regisger pwm_misc device\n"); //1.申请pwm资源,设置输出为0 pwm_dev_2 = pwm_request(1,"pwm_2"); if(pwm_dev_2 == NULL){ printk("pwm_dev_2 register fail\n"); } pwm_dev_3 = pwm_request(2,"pwm_3"); if(pwm_dev_3 == NULL){ printk("pwn_dev_3 register fail\n"); } ret = pwm_config(pwm_dev_2,0,500000); if(ret < 0){ printk("pwm_config_2 init fail\n"); return 0; } ret = pwm_config(pwm_dev_3,0,500000); if(ret < 0){ printk("pwm_config_3 init fail\n"); return 0; } ret = pwm_enable(pwm_dev_2); if(ret == 0){ printk("pwm_enable_dev_2 init success\n"); } if(ret < 0 ){ printk("pwm_enable_dev_2 init fail\n"); return 0; } ret = pwm_enable(pwm_dev_3); if(ret == 0){ printk("pwm_enable_dev_3 init success\n"); } if(ret < 0 ){ printk("pwm_enable_dev_3 init fail\n"); return 0; } //2.注册混杂设备 misc_register(&pwm_misc); return 0; } static void pwm_exit(void) { printk("unregister pwm_misc device\n"); //1.卸载混杂设备 misc_deregister(&pwm_misc); //2.释放pwm资源 pwm_config(pwm_dev_2,0,500000); pwm_disable(pwm_dev_2); pwm_free(pwm_dev_2); pwm_config(pwm_dev_3,0,500000); pwm_disable(pwm_dev_3); pwm_free(pwm_dev_3); } module_init(pwm_init); module_exit(pwm_exit); MODULE_LICENSE("GPL"); ``` ### 11.4.4 运行测试 ```c #include
#include
#include
#include
#define PWM_ON0x100001 #define PWM_OFF 0x100002 int main(void) { int fd; int a; fd = open("/dev/mypwm", O_RDWR); if (fd < 0) return -1; while(1) { ioctl(fd, PWM_ON); } close(fd); return 0; } ```
此帖出自
国产芯片交流论坛
点赞
关注
(0)
回复
分享
扫一扫,分享给好友
复制链接分享
链接复制成功,分享给好友
举报
提升卡
变色卡
千斤顶
返回列表
发新帖
回复
您需要登录后才可以回帖
登录
|
注册
发表回复
回帖后跳转到最后一页
活动
更多>>
走近 AI 重磅新品 STM32N6,解锁在 MCU 部署高性能、节能型边缘 AI!答题有好礼~还有开发板等你拿!
Microchip 直播|多相降压电源控制技术的发展与探讨 报名中!
安世半导体智能工业应用探索站,闯关赢好礼!
PI 电源小课堂:集成式半桥驱动IC BridgeSwitch 2, 助力高效永磁同步电机逆变器的设计
Microchip喊你探索dsPIC33A 芯片,70份好礼等你赢!
【瓜分2500元红包】票选2024 DigiKey “感知万物,乐享生活”创意大赛人气作品TOP3!
DigiKey应用探索站重磅上线!潮流应用,硬核技术探秘,N多干货,一站get!
验证并选择心仪MOSFET,探寻选型奥秘!注册、体验双重好礼等你拿~
开源项目
更多>>
LT6656BIDC-2.048、2.048V 低功率精密高压电源监视器的典型应用
pmos管控制与电流监测
SPC560B64A208S,用于 QFP144 封装的 SPC560 系列 512KB/1.5MB 器件的子板/适配器板
[升级版] 便携式8cm散热风扇
LF60ABDT-TR 6V 顺序极低压降稳压器多输出电源的典型应用
AiHandy
ONS321A5VGEVB:5 Vgs MOSFET 评估板
LT1172CT 的典型应用,1.25A 外部电流限制
STEVAL-ISA118V1,在反激拓扑中使用 Viper16 离线电源转换器的演示板
【湖南工业职业技术学院】简易秒表+毛少宇
随便看看
正泰的垫资交流接触器和热继电器的质量问题
[i=s]本帖最后由振动试验仪器于2025-1-2212:21编辑[/i]最近有台设备上使用的正泰交流接触器和热继电器坏了,接线端子上熔化,热继电器变形
《Linux内核深度解析》--内核互斥技术
【 EEWORLD陪你过大年,新年积分兑换盲盒收到啦,非常非常非常的不错哦】
Vicor没申请中国专利吗?
请问读FLASH中的数据时,要关闭中断吗?
大家想不想弄个智能家居系统?
分享msp430f149程序之LED
日本6月芯片设备订单出货比达1.5 创两年来新高
查找数据手册?
搜索
EEWorld Datasheet 技术支持
热门标签
源代码
单片机
放大器
TI
ST
电源
分立器件
传感器
测试测量
模拟
ARM9处理器
鸿蒙系统
涓流充电
报警系统
密码锁
铁电体
均衡器
互感
EasyX
IBM
相关文章
更多>>
台积电 CFO:2024 年四季度已获首笔 15 亿美元美国《CHIPS》法案资金
1 月 21 日消息,台积电财务长(CFO)黄仁昭在接受美媒 CNBC 采访时表示,该企业已于 2024 年四季度获得了 15 亿美元(IT之家备注:当前约 109.52 亿元人民币)的首笔美国《C
Rapidus 与 IBM 合作在美制造 2nm GAA 原型晶圆亮相,在日试产 4 月启动
1 月 21 日消息,据日媒 EE Times Japan 报道,日本先进半导体制造商 Rapidus 在 2024 年 12 月 11~13 日举行的 SEMICON Japen 2024 上,展
断供先进芯片非本意!黄仁勋:英伟达不能没有中国
1月21日消息,英伟达CEO黄仁勋没有去参加美国当选总统特朗普的就职典礼,现身北京参加公司年会。 期间黄仁勋也是接受媒体的采访,其公开表示,英伟达不能没有中国。 “我们有很多合作伙伴在中国,我们在这
苹果M4 Mac mini曝出USB-C接口问题!随机间歇性断开连接
消息称 SK 海力士有望 2 月启动业界最先进 1c nm 制程 DRAM 内存量产
未经同意出售用户数据,通用汽车遭美国 FTC 处罚
日本三井住友银行推出半导体设备抵押贷款,铠侠已率先获益
联想宣布收购Infinidat,扩充高端企业存储业务
台积电董事长:我们不是美积电 最先进制程不会搬到美国
曝台积电拒绝代工三星Exynos处理器:理由是怕泄密
新帖速递
STM32和无源蜂鸣器播放声音的问题
车规级AECQ200介绍,混合铝电解电容器的选择
嵌入式教程_DSP技术_DSP实验箱操作教程:2-28 搭建轻量级WEB服务器实验
OPA847IDBVR运放器国产替代
AG32VF407测试UART
【得捷电子Follow Me第二期】第一章 收到货物的分享
请问这个红外接收头是什么型号?能用哪个型号代替?谢谢
出售全新未拆封ZYNQ 7Z020 FPGA核心板
用在锂电池供电的水表设置上的LORA模块,当有100块水表集中安装在一个楼道内时,节能
请问一下,当某个端口被设置为 RX0后,这个端口的输入输出方向还有必要设置吗
今年怎么这么难,比疫情时还难,三十了面临失业好迷茫
请教稳压管测试问题
【小华HC32F448测评】关于小华半导体的UART中断发送和PRINTF构造和重定向
【BIGTREETECH PI开发板】 HDMI输出测试
【BIGTREETECH PI开发板】+08.音频测试(zmj)
开发板申请:拥有 AI 加持的 STM32N6570-DK 免费试用 !
申请时间:即日起-3月2日
查看 »
安世半导体智能工业应用探索站,闯关赢好礼!
点击页面内“开始探索”按钮,填写并提交表单;
请根据序号依次完成3个安世半导体智能工业应用的探索,并根据给出的资料完成共计9题(每个应用3题),答对5题以上的玩家即可获得抽奖资格;
每人仅有一次参与答题的机会,请慎重作答,活动结束后,我们将抽取30位玩家赠送礼品。
查看 »
Microchip 直播|多相降压电源控制技术的发展与探讨 报名中!
直播主题:多相降压电源控制技术的发展与探讨
直播时间:2025年2月25日(星期二)上午10:30-11:30
快来报名!
查看 »
回帖赢好礼 | 关于无线技术的那些事儿
【活动时间】即日起—2025年1月31日
【活动好礼】50元京东卡
查看 »
答题赢好礼,PI电源小课堂第3期来啦!
本期内容:集成式半桥驱动IC BridgeSwitch 2, 助力高效永磁同步电机逆变器的设计
活动时间:即日起-2月28日
看视频答题即可赢取京东卡!
查看 »
Microchip喊你探索 dsPIC33A 芯片,70份好礼等你赢!
活动时间:即日起-1月26日
活动奖励:随身Wi-Fi、家用多功能电烤箱、20000mAh充电宝、50元京东卡
查看 »
DigiKey应用探索站重磅上线!潮流应用,硬核技术探秘,N多干货,一站get!
当月好物、热门技术资源、潮流应用技术、特色活动、DigiKey在线实用工具,干货多多~
查看 »
本周精选下载推荐:电源管理基础Dummies
本周小编给大家带来一本超简单、超干货的电子书——《电源管理基础Dummies》!内容深入浅出,排版舒服简洁,分分钟能get到电源管理最核心的知识内容。
查看 »
关闭
站长推荐
1
/8
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
电信业务审批[2006]字第258号函
京公网安备 11010802033920号
Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复
返回顶部
返回列表
论坛首页
版块列表
专业技术中心
TI技术论坛
ST传感器与低功耗无线技术论坛
ADI参考电路
DigiKey得捷技术专区
ADI · 世健工业技术
电子技术交流
嵌入式系统
单片机
国产芯片交流
电机驱动控制
FPGA/CPLD
模拟电子
电源技术
PCB技术
RF/无线
传感器
综合技术交流
下载中心专版
大学堂专版
测评中心专版
创意与实践
电子竞赛
DIY/开源硬件专区
淘e淘
创意市集
行业应用
汽车电子
移动便携
医疗电子
工控电子
安防电子
休息一下
聊聊、笑笑、闹闹
工作这点儿事
为我们提意见&公告
EEWorld颁奖专区
信息发布
最新帖子
最新帖子
最新回复
精华
消灭零回复
测评中心
活动中心
积分兑换
E金币兑换
芯积分
厂商专区
TI技术论坛
ST传感器与低功耗无线技术论坛