[其它应用] 用带PWM功能的MCU产生38kHz更实用的方法.

[复制链接]
 楼主| datouyuan 发表于 2016-7-1 14:54 | 显示全部楼层 |阅读模式
用PWM功能产生38kHz比使用T2更实用.

例子是使用SH88F2051或SH88F54MCU.

  1. #define FOSC                16.6//11.0592        //
  2. #define MACHINE_NUM 1                //定时器
  3. #define M_NUM       1                //程序  SH88F2051 程序是1T,定时器1T/12T可选

  4. #define GET_PWMP(F)  MIN(MAX((FOSC*250/M_NUM/(F)),4),255)
  5. #define PWM0_SET(d,p) do{PWM0D=(d);PWM0P=(p);PWM0CON=0x91;}while(0)
  6. #define PWM0_ON()     do{PWM0CON |= 0x80;}while(0)
  7. #define PWM0_OFF()    do{PWM0CON &= 0x7f;}while(0)
  8. #define PWM1_SET(d,p) do{PWM1D=(d);PWM1P=(p);PWM1CON=0x91;}while(0)
  9. #define PWM1_ON()     do{PWM1CON |= 0x80;}while(0)
  10. #define PWM1_OFF()    do{PWM1CON &= 0x7f;}while(0)
  11. #define PWM2_SET(d,p) do{PWM2D=(d);PWM2P=(p);PWM2CON=0x91;}while(0)
  12. #define PWM2_ON()     do{PWM2CON |= 0x80;}while(0)
  13. #define PWM2_OFF()    do{PWM2CON &= 0x7f;}while(0)
  14. //PWM0_SET(GET_PWMP(38)/3,GET_PWMP(38));//pwm输出38kHz

  15. #define GET_PWMP(F)  MIN(MAX((FOSC*250/M_NUM/(F)),4),255)
  16. #define PWM_SET(d,p) do{PWMD=(d);PWMP=(p);PWMCON=0x91;}while(0)
  17. #define PWM_ON()     do{PWMCON |= 0x80;}while(0)
  18. #define PWM_OFF()    do{PWMCON &= 0x7f;}while(0)
  19. //PWM_SET(GET_PWMP(38)/3,GET_PWMP(38));//pwm输出38kHz

 楼主| datouyuan 发表于 2016-7-1 15:03 | 显示全部楼层
下面是SH88F2051产生38KHz的例子
  1. void main(void)
  2. {
  3.         CLKCON = 0x00;        //freq=Osc/1--->16.6MHz/1
  4.         PWM_SET(GET_PWMP(38)/3,GET_PWMP(38));//pwm输出38kHz
  5.         while (1)
  6.         {
  7.                 PWM_ON();
  8.                 delay_mS(5);
  9.                 PWM_OFF();
  10.                 delay_mS(5);
  11.         }
  12. }
mwxpk 发表于 2016-7-1 17:47 | 显示全部楼层
来个输出两路
 楼主| datouyuan 发表于 2016-7-8 15:35 | 显示全部楼层
本帖最后由 datouyuan 于 2016-7-8 15:43 编辑

88F2051只有1个PWM.要输出2路要用88F54.
  1. void main(void)
  2. {
  3.         CLKCON = 0x00;        //freq=Osc/1--->16.6MHz/1
  4.         PWM0_SET(GET_PWMP(38)/3,GET_PWMP(38));//pwm输出38kHz,占空比33%
  5.         PWM1_SET(GET_PWMP(100)/2,GET_PWMP(100));//pwm输出100kHz,占空比50%
  6.         while (1)
  7.         {
  8.                 PWM0_ON();
  9.                 PWM1_ON();
  10.                 delay_mS(5);
  11.                 PWM0_OFF();
  12.                 PWM1_OFF();
  13.                 delay_mS(5);
  14.         }
  15. }
bbapple 发表于 2016-7-9 16:08 | 显示全部楼层
不错的资料,学习了。。
mwxpk 发表于 2016-7-10 17:49 | 显示全部楼层
两路片子多钱?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

1088

帖子

9

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

31

主题

1088

帖子

9

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