[原创] 【 XMC4800 Relax EtherCAT Kit测评】+上手DAVE,PWM模块应用

flyword   2019-1-30 13:15 楼主
今天继续分享,使用PWM模块。今天利用PWM模块,做一个呼吸灯的应用,并从串口上打印出来相关的设置数值。具体步骤如下:
一,       添加PWM、INTERRUPT(添加2个)、UART模块。
image001.png
二,       对PWM模块进行设置,注意红色方框设定的值。频率设置是PWM信号的频率设置,DUTY占空比是一个周期内的高电平周期,这里设置为50%。
image002.png
选择事件设定,这里选择2个事件,compare 是用于匹配波形占空比设置的,period是用于匹配周期时间的。
image003.png
具体的事件解释如下图:
image005.jpg
三,       设置PWM模块的HW信号连接。具体截图如下:
image006.png
四,       配置UART的设置。设置为非中断模式的发送模式,9600-8-1-n。
image008.png
image009.png
五,       编写main程序。分别添加compare_match_handler()和period_match_handler()
中断处理函数。
六、   具体代码如下,这里实现了占空比连续增加,到达最大值后再减小。另外实现另一个LED周期性翻转,用来检验是否执行了period_match_handler()函数。
  1. /*
  2. * main.c
  3. *
  4. * Created on: 2019 Jan 29 21:23:36
  5. * Author: ????
  6. */




  7. #include <DAVE.h> //Declarations from DAVE Code Generation (includes SFR declaration)

  8. /**

  9. * [url=home.php?mod=space&uid=159083]@brief[/url] main() - Application entry point
  10. *
  11. * <b>Details of function</b><br>
  12. * This routine is the application entry point. It is invoked by the device startup code. It is responsible for
  13. * invoking the APP initialization dispatcher routine - DAVE_Init() and hosting the place-holder for user application
  14. * code.
  15. */

  16. static uint32_t duty =100;



  17. uint8_t value[10];


  18. int main(void)
  19. {
  20. DAVE_STATUS_t status;

  21. status = DAVE_Init(); /* Initialization of DAVE APPs */

  22. if(status != DAVE_STATUS_SUCCESS)
  23. {
  24. /* Placeholder for error handler code. The while loop below can be replaced with an user error handler. */
  25. XMC_DEBUG("DAVE APPs initialization failed\n");

  26. while(1U)
  27. {

  28. }
  29. }
  30. PWM_Start(&PWM_0);
  31. /* Placeholder for user application code. The while loop below can be replaced with user application code. */
  32. while(1U)
  33. {
  34. sprintf(value,"%d",duty);

  35. UART_Transmit(&UART_0,"Duty Set Value:",15);
  36. UART_Transmit(&UART_0,value,sizeof(value));

  37. UART_Transmit(&UART_0,"\r\n",2);
  38. }
  39. }

  40. void compare_match_handler()

  41. {
  42. static bool decrement_duty =(bool)false;


  43. if(decrement_duty != false)

  44. {

  45. duty =duty-100;


  46. if (duty <= 100)
  47. {

  48. decrement_duty = false;

  49. }

  50. }
  51. else

  52. {


  53. duty =duty+100;


  54. if (duty >= 10000)

  55. {

  56. decrement_duty = true;

  57. }

  58. }


  59. PWM_SetDutyCycle(&PWM_0,duty);


  60. PWM_ClearEvent(&PWM_0,PWM_INTERRUPT_COMPAREMATCH );


  61. }



  62. void period_match_handler(){

  63. DIGITAL_IO_ToggleOutput(&LED_1);

  64. PWM_ClearEvent(&PWM_0,PWM_INTERRUPT_PERIODMATCH );

  65. }

七、   编译下载运行程序,结果如下。两个led灯一个灯会呼吸,一个led灯会闪烁。
image011.jpg
运行图片.png
程序运行也录好了视频,网络问题无法上传,后续会更新相关的视频。

另外使用DAVE的APP模式编程时需要注意,只要对APP模块的应用做了修改,就必须重新产生代码,必须重新产生代码,必须重新产生代码。
好了,今天分享结束。

下次继续分享,同时之前也按照其他网友的帖子跑了跑lwip和http服务器,我会将具体操作过程细化,后面再跟大家分享一下。



回复评论 (2)

谢谢楼主分享
点赞  2019-10-14 10:45

只看到了闪烁灯的配置,并没有看到关于呼吸灯的配置,求详细步骤。

点赞  2020-12-4 17:16
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复