S3C2440 测试程序(一)PWM控制蜂鸣器测试

发布者:温柔花香最新更新时间:2016-12-06 来源: eefocus关键字:S3C2440  PWM控制  蜂鸣器测试 手机看文章 扫描二维码
随时随地手机看文章

while(1)

{

         U8 idx;

 

         Uart_Printf("\nPlease select function : \n");

         for(i=0; CmdTip[i].fun!=0; i++)

               Uart_Printf("%d : %s\n", i, CmdTip[i].tip);

         idx = Uart_GetIntNum_GJ() ;

         if(idx

        {

              (*CmdTip[idx].fun)();

              Delay(20);

              Uart_Init( 0,115200 );

        }

}

 struct {                                                                                                                                                                                                              void (*fun)(void);                                                                                                                                                                          char *tip;       }CmdTip[] = {           { Temp_function, "Please input 1-11 to select test" } ,           { BUZZER_PWM_Test, "Test PWM" } ,          { RTC_Display, "RTC time display" } ,          { Test_Adc, "Test ADC" } ,           { KeyScan_Test, "Test interrupt and key scan" } ,           { Test_Touchpanel, "Test Touchpanel" } ,           { Lcd_TFT_Test, "Test TFT LCD" } ,           { Test_Iic, "Test IIC EEPROM" } ,           { PlayMusicTest, "UDA1341 play music" } ,           { RecordTest, "UDA1341 record voice" } ,           { Test_SDI, "Test SD Card" } ,           { Camera_Test, "Test CMOS Camera"},           { 0, 0}              };

0.Temp_function
void Temp_function() { Uart_Printf("\nPlease input 1-11 to select test!!!\n"); }
注:该行为打酱油
1.BUZZER_PWM_Test
/****************************************************************************               
 蜂鸣器测试  ****************************************************************************/  void BUZZER_PWM_Test( void )  {    U16 freq =800;// lci  1000 ;      Uart_Printf( "\nBUZZER TEST ( PWM Control )\n" );       Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !\n" ) ;    Uart_Printf( "Press 'ESC' key to Exit this program !\n\n" );    Buzzer_Freq_Set( freq ) ;
/***************************************************************
  void Buzzer_Freq_Set( U32 freq )     {        //使用Timer0       rGPBCON &= ~3;   //set GPB0=10 as tout0, pwm output       rGPBCON |= 2;              rTCFG0 &= ~0xff;       rTCFG0 |= 15;   //prescaler = 15+1       rTCFG1 &= ~0xf;       rTCFG1 |= 2;   //Timer0 mux = 1/8       rTCNTB0 = (PCLK>>7)/freq;   //FCLK = 400M  HCLK = 100M  PCLK = 50M       rTCMPB0 = rTCNTB0>>1; // 50%       rTCON &= ~0x1f;       rTCON |= 0xb;   //            0              ,         1             0                        1                                 1                //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0       rTCON &= ~2;   //clear manual update bit     }  如何才能得到精确的定时呢?那就要靠TCFG0和TCFG1这两个寄存器来配置定时器的频率,即要确定TCNTOn每递减一个数所需要的时间,它们之间是倒数的关系。具体的计算公式为:

定时器输出时钟频率=PCLK ÷ (prescaler+1) ÷ divider
其中prescaler值由TCFG0决定,divider值由TCFG1决定,而prescaler只能取0~255之间的整数,divider只能取2、4、8和16。
比如已知PCLK为50MHz,而我们取prescaler为15,divider为8,则定时器频率为50000000/(15+1)/8=390625HZ,则TCNTOn每递减一个数所需时间为T=1000/390625MS
注:为什么程序里rTCNTB0 = (PCLK>>7)/freq;要移7位,因为移7位就等于PCLK/0x80,即PCLK>>7等效于 50000000/(15+1)/8=390625HZ,设完成一次PWM所需要的时间为t,则t/T= TCNTOn=rTCNTB0,计算得t=1000/freq(ms) 用示波器验证:freq = 10时,一个脉冲周期为100ms,高低电平各50ms,freq=800时,一个脉冲周期为1.25ms
现在我们要得到0.5s的中断的话,TCNTOn=500/T=390625/2=195312.5,即freq=2
rTCMPB0 = rTCNTB0>>1;又是怎么理解的呢?该句等效于rTCMPB0 = rTCNTB0/2.就是说计数一半了翻转。 那么究竟是高变低还是低变高呢。我改成了rTCMPB0 = rTCNTB0>>2;就是除4了,用示波器一看,明白了,高电平占用了1/4,低电平占用了3/4,总结如下:高电平到了rTCMPB0 就翻转成低电平直到下一个脉冲周期开始才翻转回高电平。 
rTCNTB0决定了PWM脉冲周期,rTCMPB0 决定占空比。

我们得到每递减一个数所需要的时间后,根据PWM输出波形要求,就可以计算出TCMPBN和TCNTBN的值,得到所需要的波形。 ******************************************************************/        while( 1 )        {      U8 key = Uart_Getch();        if( key == '+' )      {        if( freq < 2000 )  //lci  20000          freq += 10 ;             Buzzer_Freq_Set( freq ) ;      }       if( key == '-' )      {        if( freq > 11 )          freq -= 10 ;             Buzzer_Freq_Set( freq ) ;      }         Uart_Printf( "\tFreq = %d\n", freq ) ;      if( key == ESC_KEY )      {        Buzzer_Stop() ;
/**********************************************
      void Buzzer_Stop( void )         {           rGPBCON &= ~3;   //set GPB0 as output           rGPBCON |= 1;           rGPBDAT &= ~1;         }
***********************************************/        return ;      }    }
}


关键字:S3C2440  PWM控制  蜂鸣器测试 引用地址:S3C2440 测试程序(一)PWM控制蜂鸣器测试

上一篇:S3C2440 测试程序(二)RTC显示实验
下一篇:S3C2440 UART使用笔记

推荐阅读最新更新时间:2024-03-16 15:23

S3C2440的时钟系统
S3C2440的默认工作主频有两种12MHz和16.9344MHz,也就是我们的晶振的频率,但一般12MHz的晶振用的比较多,Fin就是指我们接的晶振频率。大家都知道s3c2440上电正常工作后频率是远远大于12MHz和16.9344MHz的,我们的s3c2440的cpu正常工作时的频率就是405MHz,因此这就需要一个电路来提升频率,在s3c2440的datasheet中找到了这个电路,下面这个就是PLL电路: 由图中可以看出,Fin进去后,经过PLL电路,最终输出两个PLL信号频率即MPLL和UPLL,这两个又是什么呢 UPLL是专用于USB设备的,MPLL是用于CPU及外围电路的,不清楚,还是得找s3c244
[单片机]
<font color='red'>S3C2440</font>的时钟系统
12-S3C2440驱动学习(九)嵌入式linux-USB驱动程序(未完待续)
1、学习思路 一个USB设备插入到系统中时,会被系统识别出USB设备,并通过系统上的USB总线驱动程序通过约定好的规范询问USB设备的信息(描述符),如设备名称。USB总线驱动程序负责:识别USB设备,给USB设备找到对应的驱动程序(自己开发)。USB设备通过约定好的规范,把描述符发送给USB总线驱动程序。 问1. 既然还没有 驱动程序 ,为何能知道是 android phone 答1. windows里已经有了USB的总线驱动程序,接入USB设备后,是 总线驱动程序 知道你是 android phone ,提示你安装的是 设备驱动程序 。 问2. USB设备种类非常多,为什么一接入电脑,就能识别出来? 答2.
[单片机]
12-S3C2440驱动学习(九)嵌入式linux-USB驱动程序(未完待续)
U-boot在S3C2440上的移植详解(五)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 9)实现u-boot对yaffs/yaffs2文件系统下载的支持。 注意:此篇对Nand的操作是基于MTD架构方式,在“u-boot-2009.08在2440上的移植详解(三)”中讲到过。 通常一个Nnad Flash存储设备由若干块组成,1个块由若干页组成。一般128MB以下容量的Nand Flash芯片,一页大小为528B,被依次分为2
[单片机]
U-boot在<font color='red'>S3C2440</font>上的移植详解(五)
06-S3C2440学习之移植2012u-boot到S3C2440(分析过程)
一、简单分析Uboot的过程 1.到官网下载u-boot-2012.04.01.tar.bz2 2.建立sourceinsight工程 a、解压并在E:colin weidongshantransplant_u-boot-2012.04.01u-boot-2012.04.01建立SI b、添加文件到SI工程 2.1、点击 Add All ,选中“Include top level sub-directories”和“Recursively add lower sub-directories”点击“OK” 2.2、选中“Board”目录,点击“Remove Tree”,去掉总个目
[单片机]
06-S3C2440学习之移植2012u-boot到<font color='red'>S3C2440</font>(分析过程)
S3C2440 字符设备的另一种写法register_chrdev_region()来注册
1、之前注册字符设备用的如下函数注册字符设备驱动: int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops) 但其实这个函数是linux版本2.4之前的注册方式,它的原理是: (1)确定一个主设备号 (2)构造一个file_operations结构体,然后放在chrdevs数组中 (3)注册:register_chrdev 然后当读写字符设备的时候,就会根据主设备号从chrdevs数组中取出相应的结构体,并调用相应的处理函数。 它会有个很大的缺点: 每注册一个字符设备的时候,
[单片机]
<font color='red'>S3C2440</font> 字符设备的另一种写法register_chrdev_region()来注册
裸机系列——s3c2440lcd汉字显示
1、lcd裸机写好后在来弄lcd的字符显示就容易多了,理解字符其实就是一副图,比如16*16的汉子显示就是长宽16的一个正方形中用点来显示一个汉字,这样就只有弄清楚哪些点是要显示的就行了,比如第一行要显示一个点我们就可以 xxxxxxxoxxxxxxxx 现在只有把中间的圈显示其他的不显示这个点就出来了,那好我们就可以用一个数组来保存哪些是要显示的点,每一位表示是否要显示,当然这一位要显示什么颜色就是前面lcd的内容了。这里只是说明这个点要不要显示的问题,具体用什么颜色显示是可以设置的。 2、对于字模数组的提取现在已经有很多好用的字模提取软件,字库软件的,到网上搜一个然后就很容易了,只要输入想要显示的汉字软件就帮你把字模的数组
[单片机]
CPLD 与AVR通信 PWM控制程序
1 library ieee; 2 3 use ieee.std_logic_1164.all; 4 5 use ieee.std_logic_arith.all; 6 7 use ieee.std_logic_unsigned.all; 8 9 10 11 entity KBCtest is 12 13 port( 14 15 rst,clk:instd_logic;--时钟和复位信号 16 17 --AVR 读写相关信号线 18 19 ale,rd,wr:instd_logic;--地址锁存、读、写信号 20 21 ad:inoutstd_logic_vector(7 dow
[单片机]
基于智能PWM控制的机车制动控制单元的设计
1 引 言 随着我国国民经济的蓬勃发展和人民生活水平的日益提高,铁路的客、货运量将越来越大,列车牵引重量与运行速度将不断提高。高速客运及重载货运列车的发展对列车制动系统提出了更高更新的要求。 国外发达国家都是采用微机应用先进控制理论实现对机车制动气缸的精确控制。而在我国机车上广泛使用的DK-l和JZ-7型制动机只能对机车实现一些简单的逻辑控制功能,不能实现对机车制动缸和均衡风缸的闭环控制,难以满足机车制动控制的需要。随着电子技术及微机控制技术应用的日渐成熟,有必要应用现代电子技术和先进的控制理论,利用微机的强大功能实现对机车的精确制动。 目前世界各国铁路绝大多数仍采用空气制动,要实现对气体压力的控制,特别是小流量压力控制,就应
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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