找回密码
 注册
搜索
查看: 1329|回复: 7

[讨论] 有关MTK PWM_configure() 函数

[复制链接]
发表于 2007-7-18 22:44:01 | 显示全部楼层 |阅读模式
MTK PWM 的一段代码如下,请问这个duty=50%是怎么算出来的啊?


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));       //为什么要左移1位?
   
   if (reg & 0x0004)
      clock = 32000;
   else
      clock = 13000000;
   
   clock = clock/clkdiv;
   
   if(0==freq)
      tmp = clock/(freq+1);
   else
      tmp = clock/(freq);
   
   tmp--;
   DRV_WriteReg(PWM1_COUNT,(kal_uint16)tmp);
   tmp = ((tmp+1)*duty)/100;
   DRV_WriteReg(PWM1_THRESHOLD,(kal_uint16)tmp);
}
/*duty=50 ==> 50%*/


kal_uint32 PWM1_Level_Info[PWM_MAX_LEVEL][2] =
{

    /*Freq,duty*/
    {200,120},  /*Level 1*/
    {200,100},  /*Level 2*/
    {200,60},  /*Level 3*/
    {200,30},  /*Level 4*/
    {200,0}    /*Level 5*/
}
[/COLOR]
 楼主| 发表于 2007-7-19 19:27:25 | 显示全部楼层
没人理????????[em06]
点评回复

使用道具 举报

发表于 2007-8-4 11:38:29 | 显示全部楼层
这是一个占空含义
点评回复

使用道具 举报

发表于 2007-8-9 14:26:00 | 显示全部楼层
这个代码应该是讲的PWM控制时的一些计数器等的配置,duty=50的含义是说占空比是50%是个定义而已....[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

 楼主| 发表于 2007-8-9 20:55:25 | 显示全部楼层
这的确是对一些寄存器的配置,但结合MTK的datasheet来算,在实现50%占空比的细节上有些不明白。[em13]
点评回复

使用道具 举报

发表于 2007-8-10 11:17:56 | 显示全部楼层
tmp--;[52RD.com]
   DRV_WriteReg(PWM1_COUNT,(kal_uint16)tmp);[52RD.com]
   tmp = ((tmp+1)*duty)/100;[52RD.com]
   DRV_WriteReg(PWM1_THRESHOLD,(kal_uint16)tmp);
假设TEMP为80,则PWM1_COUNT为79,pwm的脉冲有0到79个也就是80个,PWM1_THRESHOLD应该是高电平的数目,假设duty=50的话,那temp的值应该是40,40/80=50%,可能是这样吧...
点评回复

使用道具 举报

发表于 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*/
点评回复

使用道具 举报

发表于 2007-9-5 09:17:36 | 显示全部楼层
tmp--;
   DRV_WriteReg(PWM1_COUNT,(kal_uint16)tmp);
   tmp = ((tmp+1)*duty)/100;
   DRV_WriteReg(PWM1_THRESHOLD,(kal_uint16)tmp);

从这两句看,这是个计数和上限值,和PWM1_Level相关的,就是说计数值越大(小),level越大。没有文档么?还是看文档,否则不好猜测。
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-10-5 20:04 , Processed in 0.046139 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表