一、PWM原理
1.有源蜂鸣器和无源蜂鸣器的概念
有源蜂鸣器高电平就响,无源蜂鸣器需要PWM波才响。
2.PWM脉冲波
PWM = 定时器 + 定时器中断(重载) + IO输出(翻转)
3.分析原理图
GPIO-GPD0_0
XpwmTOUT0定时器0,同上面IO口
4.pwm定时器上的资源
5个32位定时器
定时器会产生内部中断
定时器0,1,2,3可以通过编程实现PWM,定时器4有内部计时而没有输出
定时器都有各自对应的分频区
TCNTBn--,TCNTBn=TCMPBn
5.分频器 图形24-2
XpwmTOUT0 = PRESCALER0 + MUX + TCMPB0 + TCNTB0
6.例子分析
开启自动重载
设置TCNTBn和TCMPBn寄存器
手动设置
设置自动翻转,更新TCNTBn和TCMPBn寄存器
再次设置TCNTBn和TCMPBn寄存器(双缓冲再次更新)
定时器开启
TCNTBn--,TCNTBn=TCMPBn,翻转
TCNTn=0,产生中断
自动重载
TCNTBn--,TCNTBn=TCMPBn,翻转
TCNTn=0,产生中断
自动重载,产生中断。然后关闭自动重载
TCNTBn--,TCNTBn=TCMPBn,翻转
TCNTn=0,关闭自动重载,不再产生中断
自动重载关闭,停止。
7.简单用法
GPIO-GPD0_0设置为PWM输出GPD0CON[0] = 0x02
TCFG0 预分频(1-255)
TCFG1分频(1,2,4,8,16)
设置占空比:TCMPB0 和 TCNTB0 (TCMPB0
设置自动重载,开启定时器,自动翻转等。TCON 寄存器
二、pwm的ioremap
1.配置步骤
GPD0_0设置为pwm输出GPD0CON[0]=0x02
TCFG0预分频(1-255)
TCFG1分频(1.2.4.8.16)
设置占空比:TCMPB0和TCNTB0(TCMPB0
设置自动重载,开启定时器等
TCON寄存器
2.写代码
beep驱动
pwm
#include #include #include #include #include #include #include #include #include #include #define DRIVER_NAME "PWM" #define DEVICE_NAME "PWM" MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("TOPEET"); struct pwm_addr{ unsigned int TCFG0; unsigned int TCFG1; unsigned int TCON; unsigned int TCNTB0; unsigned int TCMPB0; unsigned int TCNTO0; unsigned int TCNTB1; unsigned int TCMPB1; unsigned int TCNTO1; unsigned int TCNTB2; unsigned int TCMPB2; unsigned int TCNTO2; unsigned int TCNTB3; unsigned int TCMPB3; unsigned int TCNTO3; unsigned int TCNTB4; unsigned int TCNTO4; unsigned int TINT_CSTAT; }*PWM; //sotre virtual address and physical address volatile unsigned long virt_addr, virt_addr_gpio, phys_addr, phys_addr_gpio; volatile unsigned long *GPD0CON, *GPD0PUD; static void addr_init(void) { phys_addr = 0x139D0000; //(PWM Base Address) virt_addr = (unsigned long)ioremap(phys_addr, 0x48); //maybe 0x32 not enough PWM = (struct pwm_addr*)(virt_addr + 0x00); phys_addr_gpio = 0x11400000+0xA0; //GPD0 virt_addr_gpio = (unsigned long)ioremap(phys_addr_gpio, 0x24); GPD0CON = (unsigned long*)(virt_addr_gpio + 0x00); GPD0PUD = (unsigned long*)(virt_addr_gpio + 0x00A8 - 0x00A0); } static void PWM_Init(void) { addr_init(); /* config gpio */ *GPD0CON &= ~(0xf); *GPD0CON |= 0x2; //TOUT_0 *GPD0PUD &= ~(0x03); //disable pull-up/pull-down //prescaler0 0-254 + 1 (*PWM).TCFG0 = (((*PWM).TCFG0&(~(0xff)))|(0xf9)); //prescaler1 1.2.4.8.16 (*PWM).TCFG1 = ((*PWM).TCFG1&(~(0xf)))|(0x2); //set duty cycle (*PWM).TCMPB0 = 50; (*PWM).TCNTB0 = 100; //set auto-reload,timer on (*PWM).TCON = ((*PWM).TCON & (~(0xf))) | (0x1) | (0x2); } static void beep_on(void) { (*PWM).TCON = ((*PWM).TCON & (~(0xf)))|(0x1)|(0x8); } static void beep_off(void) { (*PWM).TCON = ((*PWM).TCON & (~(0xf)))|(0x0); //After timer stop,GPIO = 0; *GPD0CON = (*GPD0CON & (~(0xf)))|(0x0); } static int iTop4412_PWM_init(void) { PWM_Init(); beep_on(); return 0; } static void iTop4412_PWM_exit(void) { beep_off(); } module_init(iTop4412_PWM_init); module_exit(iTop4412_PWM_exit); 测试结果: [root@iTOP-4412]# insmod pwm.ko [root@iTOP-4412]# rmmod pwm 加载后蜂鸣器开启,不过频率不对 总结:根据逻辑框图中的寄存器名字,在PDF中搜索然后依次配置它。找到一个后,可以往下翻。类似的可能会在一起
上一篇:4412 按键和中断
下一篇:4412 RS485
推荐阅读最新更新时间:2024-11-11 10:47
推荐帖子
- 【智能桌面互动机器人】完结
- 智能桌面互动机器人作者:wangerxian一、作品简介本次设计为智能桌面互动机器人,顾名思义就是可以与人进行互动的智能机器人。采用了一块2.4寸LCD屏幕,作为人机信息交互的一重要渠道。同时拥有语音识别和声音播放功能,更方便无接触式的互动。界面设计采用了开源的LVGL8的GUI框架,同时采用了ESP32S3为主控芯片。在界面上可以显示当前区域温度,并可通过语音互动播报声音,同时还显示EEWORLD论坛的动态,其中包括每日发帖数量与总发帖数量
- wangerxian DigiKey得捷技术专区
- 一直对差分线不是很清楚,这块四层板差分线需要包地处理吗,能有哪位大神指导
- 刚刚从别的行业转行过来,只是参加过一些培训。对一些问题都是一知半解,在网上看资料有的差分线要求包地有的又说包地会影响信号,不知道那种说法更准确一些,或者是那种情况下才会采取上面两种措施,求大神们指点一下一直对差分线不是很清楚,这块四层板差分线需要包地处理吗,能有哪位大神指导楼主不知道那种说法对记住一条,是否对差分信号的串扰减小了楼主的文件是.brd,估计是AllegroPCB软件画的,打不开 主要就是不知道怎样判断是否对差分信号的串扰影响。减
- asionl PCB设计
- MSP430F5529与常见的矩阵键盘
- 键盘外观键盘外观一般是这个样子的,淘宝上常见的有4x4和4x3的,也有不是薄膜而是按键矩阵的键盘,但是原理都大同小异。一个普普通通的4x4键盘键盘原理图键盘的原理图一般来说,键盘有多少行多少列,就有行数+列数这么多的管脚。当按钮按下后,按钮所在行列开关合上,行列之间的管脚就连通了。单片机实现4x3键盘根据键盘的原理图,不难想到我们要用管脚扫描的方式来检测哪个键按下。将行管脚设为输入,列管脚设为
- 火辣西米秀 微控制器 MCU
- 并联式开关电源的工作原理 开关电源原理与设计(连载八)
- 1-4-1.并联式开关电源的工作原理图1-11-a是并联式开关电源的最简单工作原理图,图1-11-b是并联式开关电源输出电压的波形。图1-11-a中Ui是开关电源的工作电压,L是储能电感,K是控制开关,R是负载。图1-11-b中Ui是开关电源的输入电压,Uo是开关电源输出的电压,Up是开关电源输出的峰值电压,Ua是开关电源输出的平均电压。当控制开关K接通时,输入电源Ui开始对储能电感L加电,流过储能电感L的电流开始增加,同时电流在储能电感中也要产生磁场;当控制开关K由接通转为关断的时候,
- noyisi112 电源技术
- Beaglebone Black Development Kit
- BeagleboneBlackDevelopmentKit有时间补上你的设计框图吧持续关注老大的帖子,感觉能学到很多Linux的知识!anananjjj发表于2014-5-915:14持续关注老大的帖子,感觉能学到很多Linux的知识! 我也linux刚入门呢,有写得不准确的记得帮我指出哈~~~最近有点别的事情,一直没更新。过几天就可以继续了~,谢谢楼主分享啊!!顶一个持续关注中。。。。。。。。。。。。
- wytalfred DSP 与 ARM 处理器
- 【实战练手】解锁高性能、近500元的【EK-RA6M5】,得捷Follow me第二季第3期报名中
- 欢迎加入DigiKeyFollowme活动,在规定时间内,根据直播讲解,完成目标任务,就可返现下单本期主角EK-RA6M5的下单费用。经评审出色完成者,还将获得额外200元京东卡奖励。活动旨在带着电子爱好者学习实用的电子技术知识,积攒DIY经验,变成更好的自己!一起玩转本期主角EK-RA6M5吧~活动流程报名申请报名时间:即日起2024年10月14日报名方式:点击立即报名,认真填写报名申请表单即可。报名说明1.报名结束后
- EEWORLD社区 DigiKey得捷技术专区
设计资源 培训 开发板 精华推荐
- EVAL-AD7643CBZ,用于 AD7643、18 位、1.25 Msps PulSAR 模数转换器的评估板
- LT8601EUJ 同步降压型稳压器的典型应用电路
- LT1121ACS8-5 5V 低压差稳压器的典型应用电路,用于具有关断的电池供电电源
- 使用 LTC1867ACGN 16 位、8 通道、200 Ksps ADC 用于差分输入的典型应用电路
- 数字电路制作10-声控旋律灯
- 信仰尺(LOVE CHINA)
- OpenMV拓展板插板 - V2.0
- 运动MEMS和麦克风MEMS扩展板,适用于STM32 Nucleo
- 使用 Analog Devices 的 ADR380ARTZ 的参考设计
- stm32f446飞控
- 灵动MM32 eMiniBoard免费测评试用
- 2022 Digi-Key KOL 视频系列:你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍
- 下载有好礼!罗姆带您学习电源设计应用小技巧(功率器件篇)
- 看视频赢京东卡|泰克示波器视频学习中心重磅上线!
- 【开工大吉,抢楼有礼】聊一聊你感兴趣的技术和板子
- 泰克MDO3000系列示波器结合MDO3PWR功率分析模块 立即询价享春季好礼!
- 【开发板试用】89美金FPGA开发板试用风暴来袭!
- 春暖花开,我为TI C2000 LaunchPad“画”外围!
- 是德科技有奖直播|感恩月开幕式——示波器大讲堂
- 艾睿电子直播:聚焦“TI FPD-Link III 汽车芯片组” ,汽车视频传输理想解决方案