PWM波 及定时器

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

案例1:  P1.0 端口用TIMER2  生成PWM波

要IO口发出PWM,只需要将 IO配置为PWM输出,然后设置PWM的定时器即可:

1, 配置IO,作为PWM输出端口.

  设置P1.0 口为PWM2功能:

RESERVE_GPIO(GPIO_PORT_1, GPIO_PIN_0,PID_PWM2);

将P1.0 配置为PWM2输出端口

GPIO_ConfigurePin(GPIO_PORT_1, GPIO_PIN_0,OUTPUT,PID_PWM2,false);

 

2, 设置定时器时钟

    //Enables TIMER0,TIMER2 clock
    set_tmr_enable(CLK_PER_REG_TMR_ENABLED);    
    // Sets TIMER0,TIMER2 clock division factor to 8, so TIM0 Fclk is F = 16MHz/8 = 2Mhz
    set_tmr_div(CLK_PER_REG_TMR_DIV_8);

这里

set_tmr_enable(CLK_PER_REG_TMR_ENABLED);

为使能定时器 TIMER0 和TIMER2 的时钟。

 

set_tmr_div(CLK_PER_REG_TMR_DIV_8);

为将系统晶振 16MHz 进行8分频,然后提供给定时器0和定时器2,  

TIM0/TIM2  fHz= 16MHz/8 = 2Mhz 。

 

3, 设置PWM的频率, 设置为独立函数,可以在再调用,然后不同时间调整设置为所需频率。

void SetFrequency(uint16_t  frequency)
{
    timer2_enable(TRIPLE_PWM_DISABLED);
    timer2_init(HW_CAN_NOT_PAUSE_PWM_2_3_4, PWM_2_3_4_SW_PAUSE_ENABLED, 2000000/frequency);    // 2M/500=4000Hz=4K Hz
    timer2_set_pwm2_duty_cycle(1000000/frequency);
    timer2_set_sw_pause(PWM_2_3_4_SW_PAUSE_DISABLED);
    timer2_enable(TRIPLE_PWM_ENABLED);
}

 

 

案例2:  开启定时器0, 定时进入 TIM0的中断函数

 

1,配置定时器0.

    //Enables TIMER0,TIMER2 clock
    set_tmr_enable(CLK_PER_REG_TMR_ENABLED);    
   
    // Sets TIMER0,TIMER2 clock division factor to 8, so TIM0 Fclk is F = 16MHz/8 = 2Mhz
    set_tmr_div(CLK_PER_REG_TMR_DIV_8);
    
    // Set timer with 2MHz source clock divided by 10 so Fclk = 2MHz/10 = 200kHz
    timer0_init(TIM0_CLK_FAST, PWM_MODE_ONE, TIM0_CLK_DIV_BY_10);
    timer0_set(2000, 0, 0);//no pwm  // 1s/200KHz * 2000 = 10ms
   
    // enable SWTIM_IRQn irq
    timer0_enable_irq(); 
    
    // start pwm0
    timer0_start();

 

timer0_init(TIM0_CLK_FAST, PWM_MODE_ONE, TIM0_CLK_DIV_BY_10);

再TIM0时钟在set_tmr_div()8分频为2MHz后,在进行10分频,f= 2MHz/10 = 200kHz

这里:

 TIM0_CLK_FAST: 指使用 6MHz (fast)的快速时钟,也设置成 TIM0_CLK_32K, 如果是TIM0_CLK_32K,就是使用32kHz (slow)的慢速时钟。

pwm_mode:是用PWM_MODE_ONE模式,及set_tmr_div()分频后的时钟模式,

                   或者是PWM_MODE_CLOCK_DIV_BY_TWO模式, 直接系统16MHz,时钟2分频的时钟模式。

TIM0_CLK_DIV_t: 可以设置 TIM0_CLK_DIV_BY_10 将时钟再10分频。

                                      或者是TIM0_CLK_NO_DIV,不分频,直接使用。

 

timer0_set(2000, 0, 0);//no pwm  // 1s/200KHz *2000 = 10ms

这里是设置TIM0计数重载值,  第一个设置总的数值: 2000,意思是用上面设置的200kHz的速度计数2000所用的时间,即为定时时间200KHz / 2000 = 10ms。

后面两个0,第一个0位高电平计数,第二个0为低电平计数。

 

timer0_enable_irq();  使能定时器0的中断。

 

 

 

2, 开启定时器0的中断后, 每隔10ms,就会进入中断函数

pwm.c 文件中

 /**
 ****************************************************************************************
  @brief SWTIM_Handler. The SWTIM_IRQn interrupt handler
  ****************************************************************************************
 */

void SWTIM_Handler(void) 
{
}

 

这里面写中断处理函数。

 

 

 

 

 

 

参考:https://blog.csdn.net/wangdingjian/article/details/51440518

 

 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值