ZigBee-CC2530单片机 - 4路硬件定时器PWM输出

ZigBee-CC2530单片机 - 4路硬件定时器PWM输出

程序源码(如需定制源码私聊即可!)

#include <ioCC2530.h>
typedef unsigned char u8;
typedef unsigned int  u16;

#define TimerClock_32MHZ 1
#define TimerClock_16MHZ 2
#define TimerClock_8MHZ 3      
#define TimerClock_4MHZ 4  
#define TimerClock_2MHZ 5
#define TimerClock_1MHZ 6
#define TimerClock_500KHZ 7
#define TimerClock_250KHZ 8   
#define T1_CH1 1
#define T1_CH2 2
#define T1_CH3 3
#define T1_CH4 4
/*
定时器1的PWM映射:
            CH1:P11    
            CH2:P10 
            CH3:P07    
            CH4:P06       
*/ 
//系统时钟初始化
void SystemClockInit()
{
    CLKCONCMD &= ~0x40;      //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40); //等待晶振稳定为32M
    CLKCONCMD &= ~0x07;      //设置系统主时钟频率为32MHZ    
}

//定时器1输出PWM
//Clock为定时器时钟,count为计数值
void Timer1PwmConfig(u8 Clock,u16 count)
{  
    //时钟速度32MHz 配置定时器标记输出设置[5:3]
    if(Clock==TimerClock_32MHZ)
    {
      //000 为 32MHZ
      CLKCONCMD &= ~(1<<5);  
      CLKCONCMD &= ~(1<<4);      
      CLKCONCMD &= ~(1<<3);     
    }
    else if(Clock==TimerClock_16MHZ)
    {
      //001 为 16MHZ
      CLKCONCMD &= ~(1<<5);  
      CLKCONCMD &= ~(1<<4);      
      CLKCONCMD |= (1<<3);     
    }  
    else if(Clock==TimerClock_8MHZ)
    {
      //010 为 8MHZ
      CLKCONCMD &= ~(1<<5);  
      CLKCONCMD |= (1<<4);      
      CLKCONCMD &= ~(1<<3);     
    }  
    else if(Clock==TimerClock_4MHZ)
    {
      //011 为 4MHZ
      CLKCONCMD &= ~(1<<5);  
      CLKCONCMD |= (1<<4);      
      CLKCONCMD |= (1<<3);     
    }    
    else if(Clock==TimerClock_2MHZ)
    {
      //100 为 2MHZ
      CLKCONCMD |= (1<<5);  
      CLKCONCMD &= ~(1<<4);      
      CLKCONCMD &= ~(1<<3);     
    }  
    else if(Clock==TimerClock_1MHZ)
    {
      //101 为 1MHZ
      CLKCONCMD |= (1<<5);  
      CLKCONCMD &= ~(1<<4);      
      CLKCONCMD |= (1<<3);     
    }   
    else if(Clock==TimerClock_500KHZ)
    {
      //110 为 500KHZ
      CLKCONCMD |= (1<<5);  
      CLKCONCMD |= (1<<4);      
      CLKCONCMD &= ~(1<<3);     
    }   
    else if(Clock==TimerClock_250KHZ)
    {
      //111 为 250KH
      CLKCONCMD |= (1<<5);  
      CLKCONCMD |= (1<<4);      
      CLKCONCMD |= (1<<3);     
    }          
/*
CLKCONCMD的D5~D3位:定时器输出标记。 000 为 32MHZ , 001 为 16MHZ , 010 为 8MHZ , 011 为 4MHZ ,
100 为 2MHZ , 101 为 1MHZ , 110 为 500KHZ , 111 为 250KHZ 。默认为 001。
需要注意的是:当 D6 为 1 时,定时器频率最高可采用频率为 16MHZ    
*/     
    PERCFG |= 0x40;          //定时器1 的IO位置   1:备用位置2 
    P2SEL &= ~0x10;          //定时器1优先
    P2DIR |= 0x80;           //第1优先级:定时器1通道2-3

    P1DIR |= 0x03;
    P1SEL |= 0x03; 
    
    P0DIR |= 0xC0;
    P0SEL |= 0xC0; 
    
    count--;
    //设定周期
    T1CC0H = count>>8;           
    T1CC0L = count; 
    
    //不分频,模计数
    T1CTL = 0x02;            
}

//定时器PWM输出
void Timer1PwmOut(u8 channel,u16 value)
{
    if(channel==T1_CH1)
    {
        T1CCTL1 = 0x1c;         
        T1CC1H = value>>8;        
        T1CC1L = value;       
    }
    else if(channel==T1_CH2)
    {
        T1CCTL2 = 0x1c;
        T1CC2H = value>>8;        
        T1CC2L = value;        
    } 
    else if(channel==T1_CH3)
    {
        T1CCTL3 = 0x1c;
        T1CC3H = value>>8;        
        T1CC3L = value;        
    }    
    else if(channel==T1_CH4)
    {
        T1CCTL4 = 0x1c;
        T1CC4H = value>>8;        
        T1CC4L = value;        
    }            
}
void main(void)
{
    u16 count,CH1PWM,CH2PWM,CH3PWM,CH4PWM;
    SystemClockInit();
    count=20000;
    CH1PWM=500;
    CH2PWM=1000;
    CH3PWM=1500;
    CH4PWM=2500;
    Timer1PwmConfig(TimerClock_1MHZ,count);                
    Timer1PwmOut(T1_CH1,(count-CH1PWM));
    Timer1PwmOut(T1_CH2,(count-CH2PWM));
    Timer1PwmOut(T1_CH3,(count-CH3PWM));
    Timer1PwmOut(T1_CH4,(count-CH4PWM));
    while(1)
    {
      
    }
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WW......

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值