打印

ARM定时器,请各位帮忙,谢谢!

[复制链接]
1412|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjnc1982|  楼主 | 2008-4-15 08:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请高手指点ARM定时器
各位大虾,小弟刚学ARM,现在做简单的程序,在定时器上遇到问题,使用芯片是S3C2410,在用他做单个定时器作PWM输出时,可以进行脉宽调制,当占空比改变时改变相应TCMPB寄存器就可以调节脉宽,但当同时使用两个定时器作PWM输出时,没有波形,具体设置如何,请高手指点,谢谢!
下面是我的程序,请高手看看.

void  PWM_Init0(uint16 cycle, uint16 duty)
{    
  
    if(duty>cycle) duty = cycle;    
     // 设置定时器0,即PWM周期和占空比
    // Fclk=200MHz,时钟分频配置为1:2:4,即Pclk=50MHz。
rTCFG0 = 97;  // 预分频器0设置为98,取得510204Hz
rTCFG1 = 0;   // TIMER0再取1/2分频,取得255102Hz
rTCMPB0 = duty;     // 设置PWM占空比
rTCNTB0 = cycle; // 定时值(PWM周期)
if(rTCON&0x04) rTCON = rTCON|(1<<1);     // 更新定时器数据 (取反输出inverter位)
   else  rTCON = rTCON| (1<<2)|(1<<1);   

rSRCPND = rSRCPND|(1<<10);  // 清除中断标志 
    rINTPND = rINTPND; //|(1<<10);
    
rTCON = rTCON|(1<<0)|(1<<3);          // 启动定时器      


void  PWM_Init1(uint16 cycle, uint16 duty)
{    
  
    if(duty>cycle) duty = cycle;    
rTCMPB1 = duty;     // 设置PWM占空比
rTCNTB1 = cycle; // 定时值(PWM周期)
if(rTCON&0x0400) rTCON = rTCON|(1<<9);     // 更新定时器数据 (取反输出inverter位)
   else  rTCON = rTCON|(1<<10)|(1<<9); 

rSRCPND = rSRCPND|(1<<11);
    rINTPND = rINTPND; //|(1<<11);
      
rTCON = rTCON|(1<<8)|(1<<11);          // 启动定时器      

  
int  main(void)

    uint16  pwm_dac;  
     
     // 独立按键KEY1控制口设置
    rGPFCON = (rGPFCON & (~(0x03<<8)));                 // rGPFCON[9:8] = 00b,设置GPF4为GPIO输入模式     
    
    // TOUT0口设置
    rGPBCON = (rGPBCON & (~(0x0F<<0))) | (0x0A<<0);     // rGPBCON[1:0] = 10b,[3,2]=10b,设置TOUT0,TOUT1功能    
    rGPBUP = rGPBUP | 0x0003;                           // 禁止TOUT0,1口的上拉电阻 
      
     
    rPRIORITY = 0x00000000;  // 使用默认的固定的优先级
rINTMOD = 0x00000000;  // 所有中断均为IRQ中断
rINTMSK = ~(3<<10);   // 打开TIMER0中断允许

    // 初始化PWM输出。设PWM周期控制值为255 (即DAC分辨率为8位)
    pwm_dac = 40;                   // 初始化占空比为0,即输出0V电压
    PWM_Init0(255, pwm_dac);         
    PWM_Init1(255, 255-pwm_dac);  
                  
    // 等待按键KEY1,改变占空比 
while(1)
{                      
     WaitKey();
     
     // 由于PWM周期控制值为255,所以0.5V对应的PWM占空比的值为:0.5/3.3 * 256 = 39
  pwm_dac = pwm_dac + 39;     // 改变D/A输出的电压值
  if(pwm_dac>255) 
  {   
      pwm_dac = 40;       
  }
  rTCMPB0 = pwm_dac;
  rTCMPB1 = 255-pwm_dac;  
    }  
   
    return(0);
}

我看到周立工的指导书上单个定时器PWM时不设置中断优先级,中断类型等,不知道十么原因,谢谢!

相关帖子

沙发
zjnc1982|  楼主 | 2008-4-16 09:27 | 只看该作者

没人帮忙吗?

在单个定时器设置如做1秒中定时产生中断程序中,要设置中断服务程序,中断控制器,但在作PWM输出时,设置定时器初始化花后就不用管其他的了,只要改变比较缓冲寄存器就可以调节脉宽,为十么呢?请各位帮忙,谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝