×
单片机 > 单片机程序设计 > 详情

mini2440硬件篇之PWM定时器

发布时间:2020-06-08 发布时间:
|

1. 硬件原理

2440有5个16位定时器,其中0、1、2、3有PWM功能,有一根输出引脚,可以产生周期性高低电平变化。定时器4没有输出引脚。

2. 芯片手册

3. mini2440电路图

4. S3C2440寄存器

定时器时钟源是PCLK,先通过2个预分频器TCFG0 TCFG1降低频率,降频后就确定了定时器工作频率。初始设定值TCMPBn(用于比较反转输出电平)、TCNTBn。TCON控制定时器启动。TCMPBn的值装入TCMPn,TCNTBn的值装入TCNTn,每个定时器周期,TCNTn减1,可以通过TCNTOn读取计数值。当和TCMPn相等时,反转电平输出。减到0时,再次反转,如果TCON设置自动加载,则重复如上步骤。

 

pwm.h


  1. /******************************************************************* 

  2.  * Copyright (C),2011-2012, XXX. 

  3.  * FileName: pwm.h  

  4.  * Author:HuangYinqing 

  5.  * Version:1.0 

  6.  * Date::2012-04-22 

  7.  * Description:脉宽调制蜂鸣器驱动. 

  8.  * Function List: 

  9.  * History: 

  10.  ******************************************************************/  

  11. #ifndef __PWM_H__  

  12. #define __PWM_H__  

  13.   

  14. #define PRESCALER0  24  

  15. #define MUX0        0x2  

  16. #define PWM_CLK     ( 50000000 / (PRESCALER0+1) / ( 2 <

  17.   

  18. /*函数声明*/  

  19. void PWMInit(unsigned long ulFreq);  

  20. void PWMTest(void);  

  21.   

  22. #endif  


pwm.c


  1. /******************************************************************* 

  2.  * Copyright (C),2011-2012, XXX. 

  3.  * FileName: pwm.c  

  4.  * Author:HuangYinqing 

  5.  * Version:1.0 

  6.  * Date::2012-04-22 

  7.  * Description:脉宽调制蜂鸣器驱动. 

  8.  * Function List: 

  9.  * History: 

  10.  ******************************************************************/  

  11. #include "common.h"  

  12. #include "core.h"  

  13. #include "drv.h"  

  14.   

  15.   

  16. /******************************************************************** 

  17. 函数功能:PWM初始化。 

  18. 入口参数:无。 

  19. 返    回:无。 

  20. 备    注:定时器频率=PCLK/(预分频+1)/分频值; 

  21.     预分频24,分频8,定时器频率250kHz 

  22. ********************************************************************/  

  23. void PWMInit(unsigned long ulFreq)  

  24. {  

  25.     rGPBCON &= ~(0x3<<0);  

  26.     rGPBCON |= 0x2<<0;  

  27.       

  28.     rTCFG0 &= ~(0xff<<0);   

  29.     rTCFG0 |= PRESCALER0<<0;  //预分频24  

  30.     rTCFG1 &= ~(0xf<<0);   

  31.     rTCFG1 |= MUX0<<0;            //分频8  

  32.   

  33.     rTCNTB0 = PWM_CLK/ulFreq;           //周期  

  34.     rTCMPB0 = rTCNTB0>>1;             //占空比50%  

  35.   

  36.     rTCON &= ~0x1f;  

  37.     rTCON |= (1<<0)|(1<<1)|(1<<3);        //自动重载,手动加载,使能定时器  

  38.     rTCON &=  ~(1<<1);                    //清除手动加载  

  39. }  

  40.   

  41. /******************************************************************** 

  42. 函数功能:停止蜂鸣器。 

  43. 入口参数:无。 

  44. 返    回:无。 

  45. 备    注:无。 

  46. ********************************************************************/  

  47. void BuzzerStop( void )  

  48. {  

  49.     rGPBCON &= ~3;        

  50.     rGPBCON |= 1;        //==设置输出  

  51.     rGPBDAT &= ~1;  

  52. }  

  53.   

  54. /******************************************************************** 

  55. 函数功能:设置蜂鸣器频率。 

  56. 入口参数: 

  57.     ulFreq:蜂鸣器频率。 

  58. 返    回:无。 

  59. 备    注:无。 

  60. ********************************************************************/  

  61. void PWMSetFreq(unsigned long ulFreq)  

  62. {  

  63.     rTCNTB0 = PWM_CLK/ulFreq;                 

  64.     rTCMPB0 = rTCNTB0>>1;  

  65. }  

  66.   

  67. /******************************************************************** 

  68. 函数功能:PWM测试函数。 

  69. 入口参数:无。 

  70. 返    回:无。 

  71. 备    注:无。 

  72. ********************************************************************/  

  73. void PWMTest(void)  

  74. {  

  75.     char ucKey;  

  76.     unsigned long ulFreq;  

  77.       

  78.     while(1)  

  79.     {  

  80.         ucKey = Uart0GetChar();  

  81.   

  82.         if(ucKey == '+')  

  83.         {  

  84.             if(ulFreq 

  85.             {  

  86.                 ulFreq += 10;  

  87.                 PWMSetFreq(ulFreq);  

  88.             }  

  89.         }  

  90.       

  91.         if(ucKey == '-')  

  92.         {  

  93.             if(ulFreq > 11)  

  94.             {  

  95.                 ulFreq -= 10;  

  96.                 PWMSetFreq(ulFreq);  

  97.             }  

  98.         }  

  99.   

  100.         if(ucKey == ESC_KEY)  

  101.         {  

  102.             BuzzerStop();  

  103.             return;  

  104.         }      

  105.     }  

  106. }  


time.h


  1. /******************************************************************* 

  2.  * Copyright (C),2011-2012, XXX. 

  3.  * FileName: timer.h  

  4.  * Author:HuangYinqing 

  5.  * Version:1.0 

  6.  * Date::2012-04-22 

  7.  * Description:定时器4驱动. 

  8.  * Function List: 

  9.  * History: 

  10.  ******************************************************************/  

  11. #ifndef __TIMER_H__  

  12. #define __TIMER_H__  

  13.   

  14. #define PRESCALER1      0xf9  

  15. #define MUX4                    0x2  

  16.   

  17. /*定时器4计数*/  

  18. extern volatile unsigned long g_ulTimer4Count;  

  19.   

  20. /*函数声明*/  

  21. void Timer4Init(void);  

  22.   

  23. #endif  


timer.c


  1. /******************************************************************* 

  2.  * Copyright (C),2011-2012, XXX. 

  3.  * FileName: timer.c  

  4.  * Author:HuangYinqing 

  5.  * Version:1.0 

  6.  * Date::2012-04-22 

  7.  * Description:定时器4驱动. 

  8.  * Function List: 

  9.  * History: 

  10.  ******************************************************************/  

  11. #include "common.h"  

  12. #include "core.h"  

  13. #include "timer.h"  

  14.   

  15. /*定时器4计数*/  

  16. volatile unsigned long g_ulTimer4Count;  

  17.   

  18.   

  19. /******************************************************************** 

  20. 函数功能:定时器4中断函数。 

  21. 入口参数:无。 

  22. 返    回:无。 

  23. 备    注:无。 

  24. ********************************************************************/  

  25. static void __irq Timer4Handler(void)  

  26. {  

  27.     ClearPending(BIT_TIMER4);  

  28.     g_ulTimer4Count++;  

  29. }  

  30.   

  31.   

  32. /******************************************************************** 

  33. 函数功能:定时器4初始化。 

  34. 入口参数:无。 

  35. 返    回:无。 

  36. 备    注:定时器频率=PCLK/(预分频+1)/分频值; 

  37.     预分频249,分频8,定时器频率25kHz,40us,计数25,定时1ms 

  38. ********************************************************************/  

  39. void Timer4Init(void)  

  40. {  

  41.     rTCFG0 &= ~(0xff<<8);   

  42.     rTCFG0 |= PRESCALER1<<8;  //预分频249  

  43.     rTCFG1 &= ~(0xf<<16);   

  44.     rTCFG1 |= MUX4<<16;           //分频8  

  45.   

  46.     rTCNTB4 = 25;               //计数25  

  47.       

  48.     rTCON |= (1<<20) | (1<<21) | (1<<22); //自动重载,手动加载,使能定时器  

  49.     rTCON &=  ~(1<<21);                       //清除手动加载  

  50.       

  51.     pISR_TIMER4 = (unsigned int)Timer4Handler;  

  52.     rINTMOD &= ~BIT_TIMER4;  

  53.     rINTMSK &= ~BIT_TIMER4;  

  54. }  






『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机电子密码锁仿真 可修改密码