[Cortex-M0技术交流] RyanHsiung学习第五贴, 呼吸灯!

[复制链接]
 楼主| Ryanhsiung 发表于 2011-10-15 11:11 | 显示全部楼层 |阅读模式
本帖最后由 Ryanhsiung 于 2011-10-15 11:14 编辑

虽然说呼吸灯比较简单,但一直没有玩过,正好有这个资源顺带玩一下! 先感谢一下 “lixiaoxu2meng”这兄弟的例程真是全,没有他的范例我没有怎么快写出来!
PWM设置的设置是照着例程做的,小做修改。
PWM库很直观,但是封装了底层,若在高速可变 频率的PWM,不能用库函数去设置,一定手动对寄存器进行操作 特别是DrvPWM_SetTimerClk这个函数。

配置代码:
  1. void PWM0_Configuration(void)
  2. {
  3.         S_DRVPWM_TIME_DATA_T sPt;
  4.         DrvSYS_SelectIPClockSource(E_SYS_PWM01_CLKSRC,0);         // 使用外设时注意必须设置该外设的时钟 设置PWM01的时钟源为外部12MHZ
  5.         //PWM Timer property
  6.         sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE;                                 // 自动重载模式
  7.         // PWM 频率 为100HZ即10000us为一周期 CNR != u32Frequency,DrvPWM_SetTimerClk会根据我们相应的配置自己求出 CNR
  8.         sPt.u32Frequency = 100;                                                        
  9.         // 占空比 u8HighPulseRatio        CMR != u8HighPulseRatio,DrvPWM_SetTimerClk会根据我们相应的配置自己求出 CMR
  10.         sPt.u8HighPulseRatio =25;                                                         // 高脉冲宽度时间所占周期的百分比: 25%*/
  11.         sPt.i32Inverter = 0;                                                                 // 反向关闭
  12.         DrvPWM_Open();                                                                                 // 打开 PWM 时钟并且复位PWM
  13.         //DrvPWM_SelectClockSource(DRVPWM_TIMER0, DRVPWM_EXT_12M);//设置PWM 定时器0 为外部12 MHz crystal 时钟

  14.         DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt);                         // 配置PWM 定时器0的一些参数 如配置频率/脉冲/模式/逆转功能
  15.                
  16.         DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);                                 // 使能或关闭PWM定时器0对应的IO口输出使能
  17.         //不能使用 SYS->GPAMFP.GPA_MFP12 = 1;(没有定义 GPA_MFP12),也不能使用DrvGPIO_InitFunction(E_FUNC_PWM01);  这个函数操作了两个I0
  18.         outpw(&SYS->GPAMFP, inpw(&SYS->GPAMFP) | (0x01<<12));// 指定多功能引脚 即 PA12为PWM0

  19.         DrvPWM_Enable(DRVPWM_TIMER0, 1);                                         // 使能/关闭PWM定时器0
  20. }void PWM_Configuration(void){        PWM0_Configuration();        printf("PWM 初始成功!!\n");}



改变占空比 实现亮暗变化  这个放由SYSTICK定时调用! 大家也可以让它由其它事件调用
  1. void   PWM_Light(void)
  2. {
  3.         static uint8_t flag = 1;                                                // 标志位,用于变亮还是变暗
  4.         static uint32_t cmr = 0;                                // 计数
  5.         if(flag == 1)                                                //  变亮
  6.         {
  7.                 if(cmr++ >= 998)
  8.                 {
  9.                    flag =0        ;
  10.                 }
  11.         }
  12.                 else                                                        //  变暗
  13.                 {       
  14.                         if(cmr-- <= 1)
  15.                         {
  16.                            flag = 1         ;
  17.                         }
  18.                 }
  19.         PWM_AdjustDuty(0, cmr ,999) ;                //  这个是直接设置CNR CMR 的值,频率 = F主频/分频/(CNR+1)
  20. }


变更占空比的函数:
  1. void PWM_AdjustDuty(uint8_t pwm,uint16_t cmr,uint16_t cnr)
  2. {
  3.         switch(pwm)
  4.         {
  5.           case 0:
  6.           {               
  7.                 PWMA->CMR0   = cmr;                    //修改占空比
  8.                 PWMA->CNR0   = cnr;                    //修改占空比
  9.           }break;
  10.           case 1:
  11.           {                                                                          
  12.                 PWMA->CMR1   = cmr;                    //修改占空比
  13.                 PWMA->CNR1   = cnr;                    //修改占空比
  14.           }break;
  15.           case 2:
  16.           {                                                          
  17.                 PWMA->CMR2   = cmr;                    //修改占空比
  18.                 PWMA->CNR2   = cnr;                    //修改占空比
  19.           }break;
  20.           case 3:
  21.           {                                                         
  22.                 PWMA->CMR3   = cmr;                    //修改占空比
  23.                 PWMA->CNR3   = cnr;                    //修改占空比
  24.           }break;
  25.           default:break;
  26.         }
  27. }  
 楼主| Ryanhsiung 发表于 2011-10-15 11:16 | 显示全部楼层
本帖最后由 Ryanhsiung 于 2011-10-15 11:18 编辑

M0 PWM缺点: 不能映射Timer、PWM端口,且只能使用固定TIMER和固定的IO,灵活性不高!
对于PCB布板,及程序后续增加PWM功能 十分不便!
lixiaoxu2meng 发表于 2011-10-15 16:14 | 显示全部楼层
板凳 :lol
x181084431 发表于 2011-10-16 21:14 | 显示全部楼层
顶,给分
564451696 发表于 2011-10-25 09:36 | 显示全部楼层
这个要顶。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:道阻且长,行则将至!

64

主题

4653

帖子

14

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