|
各位大虾,小弟刚学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);
}
我看到周立工的指导书上有的不写中断优先级,不知道十么原因,谢谢!
[ 本帖最后由 zjnc1982 于 2008-4-14 16:14 编辑 ]
|
|