DA1458x使用之第二篇——PWM

来源:互联网 发布:域名com cn net的区别 编辑:程序博客网 时间:2024/06/04 18:51

DA14580有两个TIMER,TIMER0和TIMER2,TIMER0有两路PWM,TIMER2有三路PWM。TIMER0和TIMER2的区别就是TIMER0是16位的,有PWM0和PWM1,而且这两个PWM是一起的。TIMER2是14位的,有PWM2、PWM3和PWM4,是三个独立的PWM,可分别设置占空比。

下面介绍如何用PWM做一个呼吸灯。

1.先定义一个IO口

#define PWM_PORT           GPIO_PORT_1
#define PWM_PIN            GPIO_PIN_0

2.初始化IO口,PID类型为PWM0,因为要用到timer0

GPIO_ConfigurePin( PWM_PORT, PWM_PIN, OUTPUT, PID_PWM0, false );

3.timer0的初始化如下

void pwm_timer0_init(uint16_t h, uint16_t l)
{
 //Enables TIMER0 clock
  set_tmr_enable(CLK_PER_REG_TMR_ENABLED);
  //Sets TIMER0 clock division factor to 1
  set_tmr_div(CLK_PER_REG_TMR_DIV_1);
 timer0_init(TIM0_CLK_FAST, PWM_MODE_ONE, TIM0_CLK_NO_DIV);
 timer0_set(1000,h,l);
 timer0_start();
}

这里设置timer0时钟为系统时钟16MHz,不分频。

说下void timer0_set(uint16_t pwm_on, uint16_t pwm_high, uint16_t pwm_low)这个函数里的三个参数吧,

pwm_on默认设置为1000,官方3.0的SDK里这么介绍的pwm_on: ON COUNTER reload value,讲真不是特别懂是干嘛的;

pwm_high: M COUNTER reload value

pwm_low: N COUNTER reload value

high和low是设置PWM占空比的,pwm_high代表高电平的计数值,pwm_low代表低电平的计数值。

Programmable output frequency:
f = (16, 8, 4, 2 MHz or 32 kHz) / (M+1)+(N+1)
with N = 0 to (2**16)-1, M = 0 to (2**16)-1。

上面是官方数据手册里给出的计算PWM频率的方法,比如M = 0,N = 0,此时的频率为最大频率8MHz,占空比也就是50%了。

当M = 49,N =49时,频率也就是160,000Hz,占空比为50%。

Programmable duty cycle = (M+1)/((M+1)+(N+1)) *100%

这是官方手册里给出的计算PWM占空比的公式,比如当当M = 49,N =49时,占空比也就是50%。

当我们要调节占空比时,比如控制一个LED,做呼吸灯的效果,那么调用上面说到的函数timer0_set(uint16_t pwm_on, uint16_t pwm_high, uint16_t pwm_low),先设计PWM的频率,也就是16MHz/(high+ 1 + low + 1)的和,比如PWM的频率为1KHz,那么high + 1 + low + 1就应该为16000,然后,可用一个timer来修改high与low的值就可以,注意保持high与low的和为15998.

当完成设置时,启动timer0.

当然,入上一篇所说,如果定义了睡眠模式,那么当DA14580休眠时,IO口的输出电平是无法保持的,会出现DA14580唤醒时LED亮,休眠时LED就灭了,不管PWM占空比为多少。

这时,需要将睡眠先disable掉,app_disable_sleep();

当用完PWM时,可再调用app_set_extended_sleep();来恢复休眠。


关于DA14580 PWM的问题,大家可以评论或者留言,我会及时回复。









0 0
原创粉丝点击