[MINI51] ddllxxrrMiNi51学习第二贴:PWM实现节日彩灯

[复制链接]
 楼主| ddllxxrr 发表于 2012-1-14 23:44 | 显示全部楼层 |阅读模式
本帖最后由 hotpower 于 2012-9-22 12:44 编辑

来过年了,正好助学板今天到了,看到上边有个能发三色光的LED圆圆的,不错,做个节日彩灯得。

NuMicro Mini51系列内嵌了一个PWM模块,特别设计用于马达控制. PWM模块共有6组PWM发生器,可以单独配置为6个独立的PWM输出, PWM0~PWM5, 或者3对互补的PWM对, (PWM0, PWM1), (PWM2, PWM3) 和 (PWM4, PWM5) ,支持3个可编程的死区发生器.
每两个PWM发生器共享一个8位预分频器. 时钟除频提供5种除频选择(1, 1/2, 1/4, 1/8, 1/16). 每个PWM输出有独立的16比特计数器控制PWM的周期,和一个独立的16比特比较器控制PWM的占空比. 6组PWM发生器提供6个独立的PWM中断标志,每个PWM中断源有独立的中断使能位. PWM发生器可以配置成one-shot模式,只产生一个PWM周期;或者配置成自动加载模式,产生连续的PWM波形

了解了PWM基本原理,加上现成库,控制它应不难.上程序
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* */
  3. /* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved. */
  4. /* */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. #include "includes.h" //包含所需的头文件
  7. /*************************************************************************************
  8. ** Function name: main
  9. ** Descriptions: 工程模板+ IO口操作
  10. ** input parameters: 无
  11. ** output parameters: 无
  12. ** Returned value: 无
  13. *************************************************************************************/
  14. int main (void)
  15. {
  16. S_DRVPWM_TIME_DATA_T sP_PWM;

  17. Set_System(); //调用系统初始化函数




  18. /* 初始化脉冲宽度调制器 */
  19. DrvPWM_Open();
  20. /* 脉冲宽度调制器计时器属性 */
  21. sP_PWM.u8Mode = DRVPWM_AUTO_RELOAD_MODE;
  22. sP_PWM.u8HighPulseRatio = 50; /* 高电平时间 : 完整週期 = 50 : 100 */
  23. sP_PWM.u32Frequency = 0;

  24. /* 设置脉冲宽度调制器计时器频率 */
  25. sP_PWM.u8ClockSelector=DRVPWM_CLOCK_DIV_1;
  26. sP_PWM.u8PreScale = 59;
  27. sP_PWM.u32Duty = 200;
  28. sP_PWM.i32Inverter = 1;
  29. DrvPWM_SetTimerClk(DRVPWM_TIMER2, &sP_PWM);
  30. /* 始能脉冲宽度调制器输出 */
  31. DrvPWM_SetTimerIO(DRVPWM_TIMER2, 1);
  32. /* 始能脉冲宽度调制器计时器 */
  33. DrvPWM_Enable(DRVPWM_TIMER2);

  34. DrvGPIO_InitFunction(FUNC_PWM2);

  35. /*延时1秒钟*/
  36. delay_ms(1000);
  37. /*关掉PWM2*/
  38. DrvPWM_Disable(DRVPWM_TIMER2);


  39. DrvPWM_SetTimerClk(DRVPWM_TIMER1, &sP_PWM);
  40. /* 始能脉冲宽度调制器输出 */
  41. DrvPWM_SetTimerIO(DRVPWM_TIMER1, 1);
  42. /* 始能脉冲宽度调制器计时器 */
  43. DrvPWM_Enable(DRVPWM_TIMER1);

  44. DrvGPIO_InitFunction(FUNC_PWM1);


  45. delay_ms(1000);
  46. /*关掉PWM1*/
  47. DrvPWM_Disable(DRVPWM_TIMER1);


  48. DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sP_PWM);
  49. /* 始能脉冲宽度调制器输出 */
  50. DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
  51. /* 始能脉冲宽度调制器计时器 */
  52. DrvPWM_Enable(DRVPWM_TIMER0);

  53. DrvGPIO_InitFunction(FUNC_PWM0);

  54. delay_ms(1000);
  55. /*关掉PWM0*/
  56. DrvPWM_Disable(DRVPWM_TIMER0);

  57. while(1)
  58. {
  59. DrvPWM_Enable(DRVPWM_TIMER2);
  60. delay_ms(1000);
  61. /*关掉PWM2*/
  62. DrvPWM_Disable(DRVPWM_TIMER2);
  63. DrvPWM_Enable(DRVPWM_TIMER1);
  64. delay_ms(1000);
  65. /*关掉PWM1*/
  66. DrvPWM_Disable(DRVPWM_TIMER1);
  67. DrvPWM_Enable(DRVPWM_TIMER0);
  68. delay_ms(1000);
  69. /*关掉PWM0*/
  70. DrvPWM_Disable(DRVPWM_TIMER0);

  71. }

  72. }






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
Swallow_0322 发表于 2012-1-15 07:50 | 显示全部楼层
已经开始玩了,顶!
plc_avr 发表于 2012-1-15 10:38 | 显示全部楼层
有6路PWM,但主时钟没有倍频,分辩率太低,12M时钟最快也只能输出3M的脉冲,如果能再高点就好了。
mcs8098 发表于 2012-1-15 10:41 | 显示全部楼层
支持
lixiaoxu2meng 发表于 2012-1-15 14:39 | 显示全部楼层
Ryanhsiung 发表于 2012-1-15 18:28 | 显示全部楼层
有6路PWM,但主时钟没有倍频,分辩率太低,12M时钟最快也只能输出3M的脉冲,如果能再高点就好了。
plc_avr 发表于 2012-1-15 10:38

高速就要用DSP了
yulri 发表于 2012-2-9 14:16 | 显示全部楼层
记下了,好东西啊!!!
a437916817 发表于 2013-4-10 09:56 | 显示全部楼层
学习了
TWO__PIECE 发表于 2013-4-24 14:31 | 显示全部楼层
你好啊~因为毕业设计~我刚接触这个学习板~下载你的程序~MDK编译什么的都没有问题~但是下载失败~弹出target dll has been cancelled这个错误

请问是什么原因?~nu link驱动没装好?还是主板需要独立电源供电?还是其他什么原因?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2403

主题

6994

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2403

主题

6994

帖子

68

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