4412 PWM

发布者:chunxing最新更新时间:2022-01-27 来源: eefocus关键字:PWM  蜂鸣器 手机看文章 扫描二维码
随时随地手机看文章

一、PWM原理

1.有源蜂鸣器无源蜂鸣器的概念

  • 有源蜂鸣器高电平就响,无源蜂鸣器需要PWM波才响。

2.PWM脉冲波

3.分析原理图

  • GPIO-GPD0_0

  • XpwmTOUT0定时器0,同上面IO口

4.pwm定时器上的资源

  1. 5个32位定时器

  2. 定时器会产生内部中断

  3. 定时器0,1,2,3可以通过编程实现PWM,定时器4有内部计时而没有输出

  4. 定时器都有各自对应的分频区

  5. TCNTBn--,TCNTBn=TCMPBn

5.分频器 图形24-2

    XpwmTOUT0 = PRESCALER0 + MUX + TCMPB0 + TCNTB0

6.例子分析

  1. 开启自动重载

  2. 设置TCNTBn和TCMPBn寄存器

  3. 手动设置

  4. 设置自动翻转,更新TCNTBn和TCMPBn寄存器

  5. 再次设置TCNTBn和TCMPBn寄存器(双缓冲再次更新)

  6. 定时器开启

  7. TCNTBn--,TCNTBn=TCMPBn,翻转

  8. TCNTn=0,产生中断

  9. 自动重载

  10. TCNTBn--,TCNTBn=TCMPBn,翻转

  11. TCNTn=0,产生中断

  12. 自动重载,产生中断。然后关闭自动重载

  13. TCNTBn--,TCNTBn=TCMPBn,翻转

  14. TCNTn=0,关闭自动重载,不再产生中断

  15. 自动重载关闭,停止。

7.简单用法

  1. GPIO-GPD0_0设置为PWM输出GPD0CON[0] = 0x02

  2. TCFG0 预分频(1-255)

  3. TCFG1分频(1,2,4,8,16)

  4. 设置占空比:TCMPB0 和 TCNTB0 (TCMPB0

  5. 设置自动重载,开启定时器,自动翻转等。TCON 寄存器

 二、pwm的ioremap

1.配置步骤

  1. GPD0_0设置为pwm输出GPD0CON[0]=0x02

  2. TCFG0预分频(1-255)

  3. TCFG1分频(1.2.4.8.16)

  4. 设置占空比:TCMPB0和TCNTB0(TCMPB0

  5. 设置自动重载,开启定时器等

  6. 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中搜索然后依次配置它。找到一个后,可以往下翻。类似的可能会在一起

关键字:PWM  蜂鸣器 引用地址:4412 PWM

上一篇:4412 按键和中断
下一篇:4412 RS485

推荐阅读最新更新时间:2024-11-11 10:47

stm32的pwm学习总结
由于这次参加电脑鼠的芯片是stm32系列的,再加上时间上比较紧,所以在做模块时我们基本上是边学边做。遇到了不少的困难,但还是感觉学到了不少的东西,想拿出来分享分享。。好了,废话少说,转入正题。 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。 STM32的定时器除了TIM6和7。其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出,这样,STM32最多可以同时产生30路PWM输出!这里我们
[单片机]
STM32 控制舵机, 动态调整PWM
伺服电机拥有更大的扭矩,可以移动沉重的负荷。 深受玩具制造商的欢迎。很多玩具都有伺服电机和直流电机 交流伺服电机可以移动更沉重的负载,一般在工业应用。直流伺服电机最多用于搬动小物品。 span font-size:14px;font-variant-numeric:normal;font-variant-east-asian:normal;line-height:18px;white-space:normal;background-color:#ffffff; = style= overflow-wrap: break-word; color: rgb(46, 48, 51); font-family: 宋体, Arial; t
[单片机]
STM32 控制舵机, 动态调整<font color='red'>PWM</font>
51单片机播放音乐(一):蜂鸣器
蜂鸣器 蜂鸣器分为有(震动)源的和无源的,有源的无法控制频率,所以用无源的才能播放音乐。无源蜂鸣器需要自己控制输入变化的信号才能发声,最简单的就是输入方波信号了,通过单片机控制方波的频率就能发出不同音调的声音 这是发出50%占空比方波的代码: int i; while (1) { for (i = 0; i 10; ++i); // 改变循环次数可以改变方波频率 P1_0 = 1; for (i = 0; i 10; ++i); P1_0 = 0; } 乐谱转成循环次数 首先要有蜂鸣器乐谱,就是用频率和持续时间表示一个音符的乐谱,至于如何获取蜂鸣器乐谱可以看我上一篇文章。由于单片机的运行速度很慢,如果在单片
[单片机]
51单片机播放音乐(一):<font color='red'>蜂鸣器</font>
PIC单片机开发板独立键盘扫描+蜂鸣器响+数码管 C程序代码
/* 为自已写的独立键盘扫描+蜂鸣器响+数码管 犯的错:unsigned密写成了unsigner一直提示找不到a,b PORTD0=1;不行,要写成PORTD=0x01;才可以,经实验证得没有PORTD0没这个东西,应为RD0=1; PORTD=0x03;不是第三个灯亮,而是0000 0011是两个灯亮 PORTD=0x8则是0000 1000是第4个灯亮。。。。。出错因原进制转化,刚开始写程序进制转化混掉了。 */ #include pic.h #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31); const unsigned
[单片机]
PIC单片机开发板独立键盘扫描+<font color='red'>蜂鸣器</font>响+数码管 C程序代码
stm8s003MCU_PWM_引脚功能配置
最近在使用stm8s003MCU进行一款LED灯产品的开发。我使用的是TIM2的PWM输出功能,使用TIM2_CHANNEL3,PA3引脚复用为TIM2_CH3。 一、如何复用PA3引脚为TIM2_CH3 stm8MCU的引脚复用功能并不像我之前使用过的NXP的MCU或者51MCU。之前使用的NXP MCU引脚有专用的引脚功能配置寄存器,可以通过配置寄存器将引脚配置为不同功能。stm8MCU的引脚有main function(after reset)即复位后引脚的主功能,另外,引脚还有个default alternet function,比如:PA3的default alternet function就是TIM2_CH3。若要
[单片机]
Tiny4412之按键驱动
  一:按键驱动   按键驱动跟之前的LED,蜂鸣器的方法类似;通过底板,核心板我们可以看到按键的电路图:    通过电路图我们可以看出,当按键按下去为低电平,松开为高电平;所以我们要检测XEINT26的状态,通过芯片手册找到GPX3_2的说明; 有芯片手册可知:GPX3CON为0为检测,GPAC3DAT为1是高电平下面贴出代码:按键KEY1,KEY2,KEY3分别控制输出字符串,KEY4控制退出: #define GPX3CON (*(volatile unsigned long *)0x11000c60) #define GPX3DAT (*(volatile unsigned long *)0x11000c6
[单片机]
Tiny<font color='red'>4412</font>之按键驱动
stm8s103-PWM输出与输入捕获
芯片:stm8s103F3P6 软件环境:IAR for stm8 2.20.3 功能简述:使用定时器1(PD4-Tim1_ch3)输出100Hz 50%占空比的PWM波形; 定时器1(PC6-Tim1_ch1/2)检测输入PWM 波形频率和占空比; 在工程环境无问题情况下,在主函数中直接添加代码: GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST); //初始化引脚为 输出推拉,低电平,10MHz TIM2_DeInit(); //定时器2寄存器恢复到默认状态 TIM2_TimeBas
[单片机]
STC12C5201AD单片机的PWM功能的应用总结
52xxAD系列单片机的内部集成了两路可编程计数阵列模块(PCA),可用于软件定时器、外部脉冲的捕捉、高速输出和脉宽调制输出(PWM)。 这里主要是对PWM输出功能进行介绍。 首先要清楚与PCA/PWM应用有关的特殊功能寄存器 符号 描述 地址 位地址及其符号 复位值 B7 B6 B5 B4 B3 B2 B1 B0 CCON PCA control register D8H CF CR
[单片机]

推荐帖子

【智能桌面互动机器人】完结
智能桌面互动机器人作者: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得捷技术专区
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved