4412 PWM

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

一、PWM原理

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

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

2.PWM脉冲波

  • PWM = 定时器 + 定时器中断(重载) + IO输出(翻转)

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

推荐阅读

STM32学习日志——PWM输出实验
今天学习的是通用定时器的比较输出功能,也就是PWM;从它的工作过程图中很容易看出,就是计数器与比较值CCRx作比较,可以产生对应的IO口逻辑。而具体的对应关系需要对相应的寄存器进行配置。1)首先是选择工作模式,即对CCMR1的OC1M[2:0]配置,模式1是计数器小于比较值为有效电平,模式2是计数器大于比较值为有效电平。2)其次配置输出极性,0为高电平有效,1为低电平有效。3)使能比较输出。在频率确定的情况下(上一节课有提到,通过预分频系数来设定),PWM的周期是由ARR自动重装载确定,占空比是由CCRx确定,通过对这两个参数的修改,就可以得到我们想要的脉冲波。根据下面的步骤就可以输出PWM,因为使用的是PB5端口,所以需要开启TI
发表于 2023-01-31
51单片机与蜂鸣器实现摩斯电码转换
具体功能实现当我们按下矩阵按键中不同的按键时,在LCD1602显示相应的内容,同时一个按键按下多次可以切换不同的字母或数字,并且LED灯会闪烁。最后当我们按下确认时,蜂鸣器会发出不同频率的声音。器件蜂鸣器,AT89C51,若干按键,LCD1602,两支LED灯,排阻仿真展示图仿真前仿真后知识介绍矩阵按键控制原理如果使用独立按键与单片机连接, 每一个按键都需要单片机的一个 I/O 口, 若某单片机系统需较多按键, 用独立按键便会占用过多的 I/O 口资源。 单片机系统中 I/O 口资源往往比较宝贵, 当用到多个按键时为了减少 I/O 口引脚, 引入了矩阵按键。矩阵按键检测原理按键检测一般通过扫描来实现,先使某一列变为低电平,其余几列为
发表于 2023-01-30
PWM视频代码剖析与解释
1、不同频率LED灯闪烁接下来我们以下面LED灯的闪烁代码为例子,改变延时长短来看LED灯的效果void setup(){ pinMode(2, OUTPUT);}void loop(){ digitalWrite(2, HIGH); delay(50); // Wait for xx millisecond(s) digitalWrite(2, LOW); delay(50); // Wait for xx millisecond(s)}500ms延时闪烁(1Hz频率)200ms延时闪烁(2.5Hz频率)50延时ms闪烁(10Hz频率)通过三个对比实验我们发现随着频率的升高,我们的LED灯慢慢的开始感觉不到闪烁,由于我们人眼的视觉
发表于 2023-01-30
<font color='red'>PWM</font>视频代码剖析与解释
stm32的PWM实现过程
stm32的PWM实现过程  PWM是定时器扩展出来的一个功能(本质上是使用一个比较计数器的功能),配置过程一般为选定定时器、复用GPIO口、选择通道(传入比较值)、使能相应系统时钟、设定相应的预分频、计数周期、PWM模式(有两种)、电平极性等。具体介绍如下:  一、定时器的特点归类  STM32中一共有11个定时器,即 2个看门狗定时器、1个系统嘀嗒定时器(SysTick)及8个Timer定时器,详情如下表所示。  二、定时器所在时钟线路  三、PWM波形产生的原理  通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下面把它简称为比较寄存器。  这里直
发表于 2023-01-11
stm32的<font color='red'>PWM</font>实现过程
STM32呼吸灯的PWM原理与代码实现
用定时器生成PWM波PWM全称是Pulse Width Modulation,通过控制高频信号的占空比,眼睛当成低通滤波器,可以控制亮暗。再循环更改pwm的阈值,就弄出了呼吸的效果。这里采用一个比较简单的方法生成PWM波:设置定时器中断然后根据阈值判断置高和置低。void TIM3_IRQHandler(void){TIM_ClearITPendingBit(TIM3,TIM_IT_Update);if(counter==255)counter = 0;elsecounter +=1;if(mode == 0){if(counter < pwm)GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1)
发表于 2023-01-06
STM32 PWM功能在关闭时GPIO电平不确定的情况
  刚开始接触STM32,遇到一个项目中出现在产品调试中出现在关闭PWM输出时,GPIO电平有不确定的情况。在网上查阅资料发现大神们是这样解释的:PWM在一个脉冲没有结束时关闭输出,会导致GPIO电平不确定。  解决方法:1、在关闭PWM输出时随即将相应GPIO强制为低(这个高/低看各人的需要)  tiM_Cmd(TIM3 ,DISABLE);//关闭PWM输出  TIM_ForcedOC1Config(TIM3, TIM_ForcedAction_InActive);//将PWM输出强制为低  2、在下次打开PWM时使用下面的函数  /*因前面使用PWM强制输出为低,此处需要重新打开PWM输出*/  TIM_SelectOCxM(
发表于 2022-12-27

推荐帖子

问一下声音优化的问题
现在我要优化音频,希望能有一个可以直接对dsp芯片操作的api,现在的芯片是ti的tms320c54X系列芯片,可是我在下到的文档里面看到的函数好像都是dsp开发用的,没有对应用类直接支持的函数。 问一下,就是dsp开发时,一般芯片都会对音频提供硬件支持,这部分支持是否可以直接在应用层调用,还是依赖底层的驱动实现,如果有,应该去那里找,如果没有,实现的驱动一般会在上层提供什么样的接口给应用层。问一下声音优化的问题
highsea 嵌入式系统
掉电保护at24c02
本帖最后由paulhyde于2014-9-1503:09编辑请问:能不能只有当掉电的前一瞬间将数据存入at24c02进行保护,要怎么实现,一定还要添加外部电路吗 掉电保护at24c02
huangweichi123 电子竞赛
【KW41Z】LED点灯记
几经周转,折腾最好还是用了MCUXpresso点亮了LED 相比下,确实MCUXpresso比KinetisDesignStudio(KDS)好用很多。 KinetisDesignStudio(KDS)应该算是逐渐淘汰了。日后还是习惯用MCUXpresso比较方便的好 在导入工程的时修改,注意 这些选项都是宏定义的,其中宏定义在工程的属性在 后期可以根据实质进行修改 【KW41Z】LED点灯记
dvd1478 NXP MCU
wince lcd 驱动
pxa270 wince6.0 lcd是nec的NL2432HC22-41B。需要使用spi 在给lcd发送poweron命令的时候有个datainputstart 这个是做什么用的?应该发送什么data呢? wincelcd驱动
yoyomomo WindowsCE
EEWORLD大学堂----C2000系列之Concerto讲座
C2000系列之Concerto讲座:http://training.eeworld.com.cn/course/276??TI推出的新型C2000Concerto双核微控制器(MCU)系列,可帮助开发人员设计出环保性能与连接能力更佳的应用。这种新型Concerto32位微控制器将TI的具有同类领先性能的C28x内核及控制外设与ARMCortex-M3内核及连接外设组合起来,以提供一种分区明确的架构,可在单个具有成本效益的器件中支持实时控制和高级连接。为方便其使用,TI利用一种
chenyy 单片机
逻辑功能求助
inoutreg[15:0]Fsmc_data; regid_temp;always@(negedgeFsmc_NOEornegedgerst_n) begin case({Fsmc_addr,Fsmc_NBL0,Fsmc_NBL1,Fsmc_NE3,Fsmc_NOE,Fsmc_NWE}) 13'b0000111100001: begin//addr=0x6800000FNBL=0NE3=
bioger FPGA/CPLD
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved