[牛人杂谈] ML51的PWM学习

[复制链接]
 楼主| 21mengnan 发表于 2020-7-17 22:57 | 显示全部楼层 |阅读模式
先看官方例子学习流程,再看手册对应,找到关系
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2019 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Website: http://www.nuvoton.com
  8. //  E-Mail : MicroC-8bit@nuvoton.com
  9. //***********************************************************************************************************

  10. #include "ML51.h"

  11. /**
  12. * [url=home.php?mod=space&uid=247401]@brief[/url]       PWM Complementary mode PWM0 channel 0~5 output demo all with dead zone time insert.
  13. * @param       None
  14. * [url=home.php?mod=space&uid=266161]@return[/url]      None
  15. * [url=home.php?mod=space&uid=1543424]@Details[/url]     Channel 0 high duty 10%, Channel 1 high duty 20% ..... Channel 5 high duty 60%.
  16. */

  17. void main (void)
  18. {

  19. /* PWM0 initial setting  
  20.    * include pwm.c in Library for PWM mode setting
  21.    @note: the period setting of all PWM0 should be same, for example following 0x6FF.
  22. */
  23.   
  24.     PWM0_ClockSource(PWM_FSYS,128);                                    // define PWM0 clock source and divider.

  25. /* PWM period = 1/HIRC * 128 * 0x6FF =   9552 us
  26. *  high Duty 10% = 955 us  */
  27.     MFP_P05_PWM0_CH0;                                                  // multi function pin define P0.5 as PWM0 channel 0 output
  28.     P05_PUSHPULL_MODE;
  29.     MFP_P24_PWM0_CH1;                                                  // multi function pin define P2.4 as PWM0 channel 1 output
  30.     P24_PUSHPULL_MODE;
  31.     PWM0_ConfigOutputChannel(0,Complementary,EdgeAligned,0x6FF,10);    // setting PWM channel 0 as 10% duty high of 0x6FF PWM period = 0x00B3
  32.   
  33. /* PWM period = 1/HIRC * 128 * 0x6FF =   9552 us
  34. *  high Duty 30% = 2866 us  */
  35.     MFP_P03_PWM0_CH2;                                                  // multi function pin define P0.3 as PWM0 channel 2 output
  36.     P03_PUSHPULL_MODE;
  37.     MFP_P22_PWM0_CH3;                                                  // multi function pin define P2.2 as PWM0 channel 3
  38.     P22_PUSHPULL_MODE;
  39.     PWM0_ConfigOutputChannel(2,Complementary,EdgeAligned,0x6FF,30);    // setting PWM channel 2 as 30% duty high of 0x6FF PWM period = 0x0219
  40.    
  41. /* PWM period = 1/HIRC * 128 * 0x6FF =   9552 us
  42. *  high Duty 50% = 4776 us  */  
  43.     MFP_P01_PWM0_CH4;                                                  // multi function pin define P0.1 as PWM0 channel 4
  44.     P01_PUSHPULL_MODE;
  45.     MFP_P20_PWM0_CH5;                                                  // multi function pin define P0.5 as PWM0 channel 0
  46.     P20_PUSHPULL_MODE;
  47.     PWM0_ConfigOutputChannel(4,Complementary,EdgeAligned,0x6FF,50);    // setting PWM channel 4 as 50% duty high of 0x6FF PWM period = 0x037F
  48.    
  49.     PWM0_DeadZoneEnable(PWM0_CH23,0x155);
  50.    
  51.     PWM0_RUN();
  52.    
  53.     while(1);
  54. }





 楼主| 21mengnan 发表于 2020-7-17 23:01 | 显示全部楼层


结合手册和官方的例子,修改了符合开发板使用的代码。
  1. #include "ML51.H"



  2. //----------------------------------------------------------------------------------------------//
  3. void main (void)
  4. {
  5. /* As defaut all multi function define as GPIO */
  6. //  ALL_GPIO_QUASI_MODE;
  7. //        P03_QUASI_MODE;
  8. //PWM时钟源为系统时钟FSYS
  9.         PWM0_ClockSource(PWM_FSYS,128);

  10.         MFP_P03_PWM0_CH2;
  11.         P03_PUSHPULL_MODE;
  12.         PWM0_ConfigOutputChannel(2,Independent,EdgeAligned,0x6FF,90);
  13.         PWM0_RUN();
  14.   while(1)
  15.   {
  16. //    P03 ^= 1;
  17. //    Timer3_Delay(24000000,16,200,2000);

  18.   }
  19. }


 楼主| 21mengnan 发表于 2020-7-17 23:49 | 显示全部楼层
接下来在这个基础上要实现呼吸灯效果,大家都懂,定时的修改占空比。。
 楼主| 21mengnan 发表于 2020-7-17 23:50 | 显示全部楼层
经过设置发现直接修改占空比,并不能生效,好奇怪,查看手册发现有一个寄存器位是用于允许加载新的占空比的允许位,当置位后,允许加载一次新的占空比,而加载完自动清除,所以根据这个,我们找到了方法
  1. //***********************************************************************************************************
  2. //  File Function: ML51 GPIO toggle demo code
  3. //***********************************************************************************************************
  4. #include "ML51.H"



  5. //----------------------------------------------------------------------------------------------//
  6. void main (void)
  7. {
  8. int i=0;
  9.        
  10. //PWM时钟源为系统时钟FSYS
  11.         PWM0_ClockSource(PWM_FSYS,128);

  12.         MFP_P03_PWM0_CH2;
  13.         P03_PUSHPULL_MODE;
  14.         PWM0_ConfigOutputChannel(2,Independent,EdgeAligned,0x6FF,20);
  15.         PWM0_RUN();
  16.   while(1)
  17.   {
  18. for(i=0;i<=100;i++)
  19.                 {
  20.                 Timer3_Delay(24000000,4,2,5000);
  21.                 //P03 ^=1;
  22.                 //允许载入新的占空比
  23.                 set_PWM0CON0_LOAD;
  24.                 PWM0_ConfigOutputChannel(2,Independent,EdgeAligned,0x6FF,i);
  25.                 }
  26. for(i=100;i>=0;i--)
  27.                 {
  28.                 Timer3_Delay(24000000,4,2,5000);
  29.                 //P03 ^=1;
  30.                 //允许载入新的占空比
  31.                 set_PWM0CON0_LOAD;
  32.                 PWM0_ConfigOutputChannel(2,Independent,EdgeAligned,0x6FF,i);
  33.                 }

  34.   }
  35. }


 楼主| 21mengnan 发表于 2020-7-17 23:50 | 显示全部楼层
set_PWM0CON0_LOAD;
通过在设置新的占空比前,允许LOAD新的占空比,即可实现加载新的占空比,烧录效果完美。。。
598330983 发表于 2020-7-18 09:50 | 显示全部楼层
这个呼吸灯如果伽马校正一下,会更平滑,人眼看到的视觉不与功率成正比。
598330983 发表于 2020-7-18 09:53 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2019 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Website: http://www.nuvoton.com
  8. //  E-Mail : MicroC-8bit@nuvoton.com
  9. //  Date   : Jan/21/2019
  10. //***********************************************************************************************************

  11. //***********************************************************************************************************
  12. //  File Function: ML51 GPIO toggle demo code
  13. //***********************************************************************************************************
  14. #include "ML51.H"
  15. #include "math.h"


  16. //----------------------------------------------------------------------------------------------//
  17. void main (void)
  18. {
  19.         int i=0;
  20.         unsigned int j=0;
  21.         unsigned char tab[]={0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,1 ,1 ,1 ,1 ,1 ,2 ,2 ,2 ,2 ,3 ,3 ,3 ,4 ,4 ,4 ,5 ,5 ,6 ,6 ,7 ,7 ,8 ,8 ,9 ,9 ,10 ,11 ,11 ,12 ,13 ,13 ,14 ,15 ,16 ,16 ,17 ,18 ,19 ,20 ,21 ,22 ,23 ,24 ,25 ,26 ,27 ,28 ,29 ,30 ,31 ,33 ,34 ,35 ,36 ,37 ,39 ,40 ,41 ,43 ,44 ,46 ,47 ,49 ,50 ,52 ,53 ,55 ,56 ,58 ,60 ,61 ,63 ,65 ,66 ,68 ,70 ,72 ,74 ,75 ,77 ,79 ,81 ,83 ,85 ,87 ,89 ,91 ,94 ,96 ,98 ,100 };       
  22. //PWM时钟源为系统时钟FSYS
  23.         PWM0_ClockSource(PWM_FSYS,128);

  24.         MFP_P03_PWM0_CH2;
  25.         P03_PUSHPULL_MODE;
  26.         PWM0_ConfigOutputChannel(2,Independent,EdgeAligned,0x6FF,20);
  27.         PWM0_RUN();
  28.   while(1)
  29.   {
  30.                 for(i=0;i<=100;i++)
  31.                                 {
  32.                                 Timer3_Delay(24000000,4,1,10000);
  33.                                 //P03 ^=1;

  34.                  j=(unsigned int)(pow(i,2.2)/251.1886);
  35.                                 //允许载入新的占空比
  36.                                 set_PWM0CON0_LOAD;
  37.                                 PWM0_ConfigOutputChannel(2,Independent,EdgeAligned,0x6FF,j);
  38.                                 }
  39.                                
  40.                 for(i=100;i>=0;i--)
  41.                                 {
  42.                                 Timer3_Delay(24000000,4,1,10000);
  43.                                 //P03 ^=1;
  44.                  j=(unsigned int)(pow(i,2.2)/251.1886);
  45.                                 //允许载入新的占空比
  46.                                 set_PWM0CON0_LOAD;
  47.                                 PWM0_ConfigOutputChannel(2,Independent,EdgeAligned,0x6FF,j);
  48.                                 }

  49.                         }
  50. }
598330983 发表于 2020-7-18 09:54 | 显示全部楼层
实际上这种按照百分比的占空比调节,如果用伽马校正,就会有很多失真部分,也不是很可取。还要细分才行。
yiy 发表于 2020-7-19 19:13 | 显示全部楼层
这么一个一个的搞清楚,就成高手了。
小灵通2018 发表于 2020-7-19 19:18 | 显示全部楼层
整个理论都是相似的。
xinpian101 发表于 2020-7-19 22:30 | 显示全部楼层
理解的到位。
character 发表于 2020-8-31 13:02 | 显示全部楼层
学习了
touxiong 发表于 2020-12-29 15:24 | 显示全部楼层
@21mengnan 请教 ML51 用keil开发没有pack 无法编译怎么解决
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

1140

帖子

1

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

87

主题

1140

帖子

1

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