[DemoCode下载] 新唐MINI51 PWM初始化设置及应用

[复制链接]
 楼主| C洛达尔多 发表于 2016-3-8 20:40 | 显示全部楼层 |阅读模式
  1. #include "Register_Bit.h"   //包含位定义文件     

  2. //#define       PWM_DIV1    (uint8_t)1  //不能设置1分频 否则定时器停止工作  
  3. #define     PWM_DIV2    (uint8_t)2  
  4. #define     PWM_DIV4    (uint8_t)4  
  5. #define     PWM_DIV8    (uint8_t)8  


  6. #define     PWM_CYC (uint16_t)750  


  7. #define     PWM1_CPIEN_ENB  PIER |= (1<<9) //使能PWM1比较中断 用于检测过流  
  8. #define     PWM1_CPIEN_DIS  PIER &= ~(1<<9)   

  9. #define     PWM0_PIN_ENB    PWMPOE |= (PWM0_OE)//PWMPOE |= (1<<0)      
  10. #define     PWM0_PIN_DIS    PWMPOE  &= ~(PWM0_OE)   
  11. #define     PWM2_PIN_ENB    PWMPOE  |= (PWM2_OE)   
  12. #define     PWM2_PIN_DIS    PWMPOE  &= ~(PWM2_OE)   
  13. #define     PWM4_PIN_ENB    PWMPOE  |= (PWM4_OE)   
  14. #define     PWM4_PIN_DIS    PWMPOE  &= ~(PWM4_OE)   



  15. //*************************************  
  16. // 函数名称:Init_PWM  
  17. // 函数功能:PWM定时器分频系数 PWM重载值  
  18. // 入口参数:无  
  19. // 出口参数:无  
  20. //***************************************/  
  21. void Init_PWM(uint8_t psc,uint32_t Tcon)  
  22. {  
  23.     uint8_t  Tmp = 0 ;  

  24.     /* Select PWM01 clock source as HCLK */   
  25.     CLKSEL1 = (CLKSEL1 & (~PWM01_CLK)) | PWM01_HCLK;      
  26.     /* Select PWM23 clock source as HCLK */   
  27.     CLKSEL1 = (CLKSEL1 & (~PWM23_CLK)) | PWM23_HCLK;      
  28.     /* Select PWM45 clock source as HCLK */   
  29.     CLKSEL2 = (CLKSEL2 & (~PWM45_CLK)) | PWM45_HCLK;      

  30.     /* Switch P2.2~P2.4 P2.6 to PWM0 2 4 output */  
  31.     P2_MFP = P2_MFP & (~(P22_MFSEL | P24_MFSEL | P26_MFSEL))  
  32.              | (P22_PWM0 | P24_PWM2 | P26_PWM4);        

  33.     /* Reset PWM IP  外设先复位再使能 */  
  34.     IPRSTC2 |= PWM_RST;  
  35.     IPRSTC2 &= ~PWM_RST;      

  36.     /* Enable pwm01 23 45 clock source */  
  37.     APBCLK |= PWM01_CLKEN ;  
  38.     APBCLK |= PWM23_CLKEN ;  
  39.     APBCLK |= PWM45_CLKEN ;  

  40.     //PWM 预分频   
  41.     Tmp = psc - 1 ;   //不能设置1分频 否则定时器停止工作  
  42.     PPR |= (Tmp << 0) | (Tmp << 8) | (Tmp << 16);   

  43.     //时钟源选择 在PWM输入时钟时分频 现设置不分频 T0-T5  
  44.     /* Select PWM0~5 clock divider */                 
  45.     CSR |= (CSR0_CLK_1 | CSR1_CLK_1 | CSR2_CLK_1  
  46.             | CSR3_CLK_1 | CSR4_CLK_1 | CSR5_CLK_1);  

  47.     /* Select PWM edge-aligned. */  
  48.     PCR &= EDGE_ALIGN;  

  49.     /* PWM under auto-reload (continuous) mode, select output channel non-invertion, set independent mode */                                    
  50.     PCR = PCR & (~PWMMODE) | INDEPENDENT;   //独立模式  
  51.     PCR |= (CH0_AU_RL | CH2_AU_RL | CH4_AU_RL  
  52.            | CH1_AU_RL | CH3_AU_RL | CH5_AU_RL);    //自动重载  

  53.      //设置组模式 PWM0 PWM2 PWM4 同步由PWM0控制  
  54.      PCR |= (1<<30) ;   

  55.      //PWM 计数重载值  
  56.      CNR0 = Tcon ;//1500  
  57.      CNR2 = Tcon ;  
  58.      CNR4 = Tcon ;  
  59. /*
  60.      CNR1 = Tcon ;
  61.      CNR3 = Tcon ;
  62.      CNR5 = Tcon ;
  63.     */  
  64.      //PWM占空比寄存器  
  65.      CMR0 = 0 ;  
  66.      CMR2 = 0 ;  
  67.      CMR4 = 0 ;  
  68. /*
  69.      CMR1 = 0 ;
  70.      CMR3 = 0 ;  
  71.      CMR5 = 0 ;
  72.      */  

  73.     /* Reset PWM counter */                                    
  74.     PCR |= CLRPWM;   

  75.     PWMPOE  &= 0X00 ; //禁止使能PWM0 PWM2 PWM4 输出到引脚上  

  76.     /* PWM circuit enable and start to run 开始计数 */                                    
  77.     PCR |= (CH0EN | CH2EN | CH4EN);  
  78.     PCR |= (CH1EN);   

  79. }  
  80. //*************************************  
  81. // 函数名称:ToPwm_Value  
  82. // 函数功能:重置PWM比较寄存器 ->设置占空比  
  83. // 入口参数:占空比参数  
  84. // 出口参数:无  
  85. //***************************************/  
  86. void ToPwm_Value(uint16_t InValue)  
  87. {  
  88.      CMR0 = InValue ;   //组模式下 PWM2 PWM4 与PWM0同步  
  89. //   CMR2 = InValue ;  
  90. //   CMR4 = InValue ;  
  91. }  


  92. //---实例应用------  
  93.     //设置8KPWM  
  94.     Init_PWM(PWM_DIV2,PWM_CYC) ;    //12M/2=6M 计750次 8M_PWM  


734774645 发表于 2016-3-8 22:15 | 显示全部楼层
此例子为何没有提供系统时钟配置的函数呢,还是只是一个完整程序的一部分呢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

236

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部