|
发表于 2007-8-11 09:41:37
|
显示全部楼层
void PWM1_Configure(kal_uint32 freq, kal_uint8 duty)
{
kal_uint32 clock;
kal_uint32 tmp;
kal_uint16 clkdiv;
kal_uint16 reg;
ASSERT(duty <= 100);
PWM1_FRE_SAVE=freq;
PWM1_DUTY_SAVE=duty;
reg = DRV_Reg(PWM1_CTRL);
clkdiv = (1 << (reg & 0x0003)); //取得CLK分频因子
if (reg & 0x0004)
clock = 32000;
else
clock = 13000000;
clock = clock/clkdiv; //取得分频后的 PWM CLK
if(0==freq)
tmp = clock/(freq+1);
else
tmp = clock/(freq);
tmp--;
DRV_WriteReg(PWM1_COUNT,(kal_uint16)tmp); //PWM提供的CLK 与 要设置的freq相比,写入计算器
//有点类似于分频的意思,来得于我们要设置的freq
tmp = ((tmp+1)*duty)/100;//在以后用这个函数的时候,我们都是基于百分之多少来考量的。
//所以这里我们将占空比duty与100来换算。然后再写入THRESHOLD寄存器
DRV_WriteReg(PWM1_THRESHOLD,(kal_uint16)tmp);
}
/*duty=50 ==> 50%*/ //duty=50,则表示count从0到100,0-49高电平,50-99低电平
//设置不同的level来调节占空比。
kal_uint32 PWM1_Level_Info[PWM_MAX_LEVEL][2] =
{
/*Freq,duty*/ //个人认为duty的设置最大应为100
{200,120}, /*Level 1*/ //{200,20}, /*Level 1*/
{200,100}, /*Level 2*/ //{200,40}, /*Level 2*/
{200,60}, /*Level 3*/ //{200,60}, /*Level 3*/
{200,30}, /*Level 4*/ //{200,80}, /*Level 4*/
{200,0} /*Level 5*/ //{200,100} /*Level 5*/ |
|