一、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-17 00:18
推荐帖子
- LED芯片制造设备现状及其工艺介绍
- Timson,如果您要查看本帖隐藏内容请回复LED芯片制造设备现状及其工艺介绍哟,,,看帖看来都要回啊看看vlook谢谢分享seee看看而已led回复楼主探路者的帖子很重要哦。。led学习学习顶顶吧,不然看不成!学习1111
- 探路者 LED专区
- 矩形波产生芯片或产生电路
- 要求:1.矩形波输出;2.输出电压7V以上3.输出频率可调,或者100Hz左右固定。4.外围电路尽量简单,只要几个电阻电容能起振就行,芯片封装要劲量小。因为电路大小要求指甲盖程度大小。5.最好两路输出,两路波形能有180°相位差。请有接触过相关电路的大侠不吝指教。谢谢了。矩形波产生芯片或产生电路74HC04加电阻电容恩搞定,谢谢回复沙发ssawee的帖子
- hotguang 综合技术交流
- 遇到难题了
- 你看这是at89x51.hat89x51..h里的位定义sfrSCON=0x98;sfrSBUF=0x99;这么说来缓冲器的地址和SCON.1的地址重合了,这么可以重呢,这个寄存器还是占用8位的字节吗?若是,岂不是把SCON的全占用了scon是98H~9FH,真不清楚SBUF在何处安身的,迷糊,迷糊呀,斑竹/at89x51..h 遇到难题了,我觉得你犯了一个理解上的错误。不知道你有没有看过内存的存储图,下图是一张存储图,我们可以看出每个地址一直往下递增,
- zzbeagle 综合技术交流
- 为什么地址总结长度是8的倍数,例如8位,16位,32位,64位这些都是8的位数?为什么一个字节要等于8个 比特??
- 为什么地址总结长度是8的倍数,例如8位,16位,32位,64位这些都是8的位数?为什么一个字节要等于8个比特??为什么地址总结长度是8的倍数,例如8位,16位,32位,64位这些都是8的位数?为什么一个字节要等于8个比特??如果计算机是你发明的,你就可以让他等于任何数,哈哈,只要是2的整数倍就可以了为什么呢?为什么要是2的倍数呢?为什么呢?为什么要是2的倍数呢?为什么呢?为什么要是2的倍数呢?D因为计算机只认识0和1这个是大多数人的习惯,事实上总线长度并不总是8的整数倍
- meja 嵌入式系统
- 多传感器融合技术 拜托各位帮下忙
- 拜托各位大哥,传感器数据融合的有什么新的方法么?需要答辩创新。传统的神经网络都已经用烂了没有新意,答辩过不了。。。拜托各位大哥帮忙看下好么?多传感器融合技术拜托各位帮下忙滤波?:loveliness: ??不是啊就是数据融合的方法现在论文上神经网络不是都用了好几十年了么毕业有需要创新有没有什么新的融合算法之类的拜托目前也就神经网络加智能选取了
- zhaozeyu123045 传感器
- DC-DC升压电路,FB管脚电压有一个异常脉冲
- 如下图所示DC-DC升压电路,用数字电位器调节输出,FBX管脚处的网络RW和RH连接数字电位器的两个输出端。现在的问题是,在输出电压由高电压跳变成低电压瞬间,FBX管教处的电压跳变到4.75V(见下面示波器波形图),而正常的FBX电压为1.6V。导致数字电位器和MCU烧毁(数字电位器和MCU都是1.8V供电)。请问各位大佬,这个问题是什么原因导致的呢?怎么解决呢?谢谢!注:输出低电平到高电平瞬间,FBX的电压貌似也会跳变到2.2V。
- xiaxingxing 电源技术