[技术问答] 这个PWM的库函数是不是频率不是实际频率

[复制链接]
934|8
 楼主| dongnanxibei 发表于 2020-7-18 15:36 | 显示全部楼层 |阅读模式
  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] This function config PWM generator
  3. * @param[in] u8ChannelNum PWM channel number. Valid values are between 0~5
  4. * @param[in] u8OPMode PWM run mode select from Independent, Complementary or Synchronized mode.
  5. * @param[in] u8PwmType select Edge-Aligned Type or Center-Aligned Type
  6. * @param[in] u32PWM0Frequency Target generator frequency, note the actually PWM period is 16bit value. from 0x0000 ~ 0xFFFF
  7. * @param[in] u16DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%...
  8. * [url=home.php?mod=space&uid=266161]@return[/url] none
  9. * [url=home.php?mod=space&uid=536309]@NOTE[/url]  none      
  10. * [url=home.php?mod=space&uid=389923]@example[/url] PWM0_ConfigOutputChannel(0,Independent,EdgeAligned,0x6FF,10);
  11.   */
  12. void PWM0_ConfigOutputChannel(unsigned char u8PWM0ChannelNum,
  13.                               unsigned char u8PWM0OPMode,
  14.                               unsigned char u8PWM0PwmType,
  15.                               unsigned long u32PWM0Frequency,
  16.                               unsigned int u16PWM0DutyCycle)
  17. {
  18.   SFRS = 0x01;
  19.   switch (u8PWM0OPMode)
  20.   {
  21.       case Independent:    PWM0CON1&=0x3F;break;
  22.       case Complementary:  PWM0CON1&=0x3F;PWM0CON1|=0x40;break;
  23.       case Synchronous:    PWM0CON1&=0x3F;PWM0CON1|=0x80;break;
  24.   }
  25.   switch (u8PWM0PwmType)
  26.   {
  27.       case EdgeAligned:    PWM0CON1&=0xEF;break;
  28.       case CenterAligned:  PWM0CON1|=0x10;break;
  29.   }
  30.   switch (u8PWM0ChannelNum)
  31.   {
  32.       case 0:  PWM0C1H=(u32PWM0Frequency*u16PWM0DutyCycle/100)>>8;PWM0C0L=(u32PWM0Frequency*u16PWM0DutyCycle/100);break;
  33.       case 1:  PWM0C1H=(u32PWM0Frequency*u16PWM0DutyCycle/100)>>8;PWM0C1L=(u32PWM0Frequency*u16PWM0DutyCycle/100);break;
  34.       case 2:  PWM0C2H=(u32PWM0Frequency*u16PWM0DutyCycle/100)>>8;PWM0C2L=(u32PWM0Frequency*u16PWM0DutyCycle/100);break;
  35.       case 3:  PWM0C3H=(u32PWM0Frequency*u16PWM0DutyCycle/100)>>8;PWM0C3L=(u32PWM0Frequency*u16PWM0DutyCycle/100);break;
  36.       case 4:  PWM0C4H=(u32PWM0Frequency*u16PWM0DutyCycle/100)>>8;PWM0C4L=(u32PWM0Frequency*u16PWM0DutyCycle/100);break;
  37.       case 5:  PWM0C5H=(u32PWM0Frequency*u16PWM0DutyCycle/100)>>8;PWM0C5L=(u32PWM0Frequency*u16PWM0DutyCycle/100);break;
  38.   }
  39.   PWM0PH = u32PWM0Frequency>>8;
  40.   PWM0PL = u32PWM0Frequency;
  41. }
大家看看这个例子,一共五个参数,第四个是PWM频率,而函数内,直接把这个频率值付给了PWM0PH和PWM0PL,这个值
48845f12a5fb54401.png
应该就是分母上这个值吧,这个值可不是频率吧,是一个PWM周期对应的PWM时钟数-1啊。

734774645 发表于 2020-7-18 16:19 | 显示全部楼层
是啊,你理解的很对。
huangcunxiake 发表于 2020-7-18 20:02 | 显示全部楼层
这么看,真不是,太坑了。
huangcunxiake 发表于 2020-7-18 20:03 | 显示全部楼层
其实完全可以修改一下库函数的,前面设置PWM时钟的时候,只需要选择时钟源就行了,后面读出来,然后自动配置成合适的周期。。
稳稳の幸福 发表于 2020-7-19 12:32 | 显示全部楼层
多谢提醒。
yiy 发表于 2020-7-19 16:08 | 显示全部楼层
楼主理解的对,要自己计算。
xinpian101 发表于 2020-7-19 22:57 | 显示全部楼层
嗯,好,记住了。
稳稳の幸福 发表于 2020-7-19 23:26 | 显示全部楼层
没有ARM内核的那个库函数写的好,不过那个消耗资源,这个51的,没法按那种,那个是要程序里面自己搜索最佳参数,配置频率的。
gejigeji521 发表于 2020-7-20 21:21 | 显示全部楼层
自己计算啊,要不要自己编程,算一下,最优配置方案。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

225

主题

3848

帖子

18

粉丝
快速回复 在线客服 返回列表 返回顶部