XMEGA PWM模块多通道的用法

分享到:

下面介绍ASF中PWM模块同时使用多个通道的用法:

  • 定义PWM变量,每个通道需要单独定义一个变量
      struct pwm_config pwm_1;
      struct pwm_config pwm_2;
  • 使用pwm_init函数初始PWM。如果是同一个PWM模块(定时器),需要使用相同的频率参数。
  • 设置每个通道的占空比
      pwm_set_duty_cycle_percent(&pwm_1, duty);
      pwm_set_duty_cycle_percent(&pwm_2, duty);


pwm_set_duty_cycle_percent和pwm_start函数的区别
虽然两个函数都是设置占空比的,参数也完全相同,但是pwm_start还会再次设置定时器参数,比 pwm_set_duty_cycle_percent速度慢,效率低,所以一般是PWM初始化时用pwm_start函数,其他地方使用pwm_set_duty_cycle_percent函数。

参考代码,控制XMEGA A3BU Xplained的PD6/OC1A和PD5/OC1B。因为在硬件上,两个LED是反相的,所以设置占空比时需要用100-duty。

  1. #include <asf.h>
  2.  
  3. struct pwm_config pwm_1;
  4. struct pwm_config pwm_2;
  5.  
  6. uint8_t duty = 0;
  7.  
  8. int main (void)
  9. {
  10.     board_init();
  11.     sysclk_init();
  12.     delay_init();
  13.    
  14.     pwm_init(&pwm_1, PWM_TCD1, PWM_CH_B, 500);
  15.     pwm_start(&pwm_1, 0);
  16.     pwm_init(&pwm_2, PWM_TCD1, PWM_CH_A, 500);
  17.     pwm_start(&pwm_2, 100);
  18.    
  19.     while(1)
  20.     {
  21.         duty += 1;
  22.         if(duty > 99)
  23.         duty = 0;
  24.  
  25.         pwm_set_duty_cycle_percent(&pwm_1, duty);
  26.         pwm_set_duty_cycle_percent(&pwm_2, 100 - duty);
  27.  
  28.         delay_ms(50);
  29.     }
  30. }


完整程序下载地址:http://atmel.eefocus.com/module/forum/thread-5920-1-1.html

 

更多Atmel及科技资讯请关注:  
Atmel中文官网:http://www.atmel.com/zh/cn/
Atmel技术论坛:http://atmel.eefocus.com/
Atmel中文博客:http://blog.sina.com.cn/u/2253031744
Atmel新浪微博:http://www.weibo.com/atmelcn

 


©2017 Microchip Corporation
facebook google plus twitter linkedin youku weibo rss