[菜农助学交流] PWM0输出循环加的占空比

[复制链接]
2491|0
 楼主| tao560532 发表于 2011-12-3 21:08 | 显示全部楼层 |阅读模式
PWM, TI, IO, TE, ST
刚开始就是看看技术应用手册了,看看PWM的硬件资源,还有一些内部结构图以及寄存器是如何设置的。

PWM
也要给他提供一个时钟源,一共有四种时钟源。具体看手册,还有一个就是内部结构图了,

这个比较复杂了,第一级是设置分频系数,PWM一共四组,总共是PWM0PWM8,每一组是互补的,


[/code]
  1. /***************************************************************************************
  2. * File Name : NUC120_HOT_PWM.c
  3. * Copyright : 2011-2011 ecjtu Corporation,All Rights Reserved
  4. * Module Name : PWM
  5. *
  6. * CPU : Cortex-M0
  7. * RTOS : NO
  8. * Create Date : 2011/12/03
  9. * Author/Corporation : 涛行天下/华东交通大学
  10. *
  11. * Abstract Description : PWM,LED
  12. *---------------------------Revision History--------------------------------
  13. * Revision History
  14. * No. Version Date Revised by Item Description
  15. * 1 V0.0 11.12.03 涛行天下 ... ....
  16. ***************************************************************************************/
  17. #include <stdio.h>
  18. #include "NUC1xx.h"
  19. #include "Driver\DrvGPIO.h"
  20. #include "Driver\DrvSYS.h"
  21. #include "Driver\DrvUART.h"
  22. #include "Driver\DrvTIMER.h"
  23. #include "Driver\DrvPWM.h"


  24. #define Run_Led 2 //2----LED1 3----LED2 4----LED3 5----LED4

  25. volatile uint8_t PWM0_Duty_Cycle = 50; //PWM占空比

  26. /***************
  27. ** 函数声明 **
  28. ***************/
  29. void Init_System (void);
  30. void Init_Uart (void);
  31. void Init_PWM0(void);

  32. void UART_INT_HANDLE(uint32_t u32IntStatus);


  33. /***************************************************************************************
  34. * Function Name : Init_System
  35. * Create Date : 2011/12/03
  36. * Author/Corporation : 涛行天下/华东交大
  37. *
  38. * Description : 系统初始化函数
  39. *
  40. * Param : None
  41. *
  42. *
  43. * Return Code : None
  44. * Global Variable : None
  45. * File Static Variable : None
  46. * Function Static Variable : None
  47. *
  48. *----------------------------------------------------
  49. * Revision History
  50. * No. Date Revised by Item Description
  51. * V0.5 2011/12/02 涛行天下 初始化 系统初始化函数
  52. ***************************************************************************************/
  53. void Init_System(void)
  54. {
  55. /* Unlock the locked registers before access */
  56. UNLOCKREG(x); //寄存器锁定键地址寄存器(RegLockAddr) :有些系统控制寄存器需要被保护起来,以防止误操作而影响芯片运行,
  57. //这些寄存器在上电复位到用户解锁定之前是锁定的。用户可以连续依次写入“59h”, “16h” “88h”到0x5000_0100解锁定.

  58. /* Enable the 12MHz oscillator oscillation */
  59. //确定时钟
  60. DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); //SYSCLK->WRCON.XTL12M_EN = 1;

  61. /* Waiting for 12M Xtal stable */
  62. //while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1); //SYSCLK->CLKSTATUS.XTL12M_STB
  63. /*eClkSrc - [in] E_SYS_XTL12M / E_SYS_XTL32K / E_SYS_OSC22M / E_SYS_OSC10K / E_SYS_PLL */
  64. // Note: Only some of NuMicro NUC100 Series support this function.
  65. DrvSYS_Delay(5000);

  66. LOCKREG(x);
  67. //向“0x5000_0100”写入任何值,就可以重锁保护寄存器
  68. }


  69. /*****************************
  70. ** Name: Init_PWM0
  71. ** Function: Timer0初始化函数
  72. ** Input: None
  73. ** OutPut: None
  74. ** Data: 2011-04-02
  75. ** Note:
  76. ****************************/

  77. /***************************************************************************************
  78. * Function Name : Init_PWM0
  79. * Create Date : 2011/12/03
  80. * Author/Corporation : 涛行天下/华东交大
  81. *
  82. * Description : 初始化PWM0函数
  83. *
  84. * Param :
  85. *
  86. *
  87. * Return Code : None
  88. * Global Variable : None
  89. * File Static Variable : None
  90. * Function Static Variable : None
  91. *
  92. *----------------------------------------------------
  93. * Revision History
  94. * No. Date Revised by Item Description
  95. * V0.5 2011/12/02 涛行天下 初始化 PWM0初始化函数
  96. ***************************************************************************************/
  97. void Init_PWM0(void)
  98. {
  99. S_DRVPWM_TIME_DATA_T sPt;
  100. /*
  101. 声明 PWM Timer设置的结构体 位于DRVPWM.H
  102. 结构体如下:
  103. typedef struct
  104. {
  105. uint8_t u8Mode;
  106. uint8_t u8HighPulseRatio;
  107. uint8_t u8ClockSelector;
  108. uint8_t u8PreScale;
  109. uint32_t u32Frequency;
  110. uint32_t u32Duty;
  111. int32_t i32Inverter;
  112. }S_DRVPWM_TIME_DATA_T;
  113. */

  114. /* PWM Timer property */
  115. sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE; /*自动重载模式 DRVPWM_ONE_SHOT_MODE为单触发模式*/
  116. sPt.u32Frequency = 400; /*PWM 频率 为400HZ即2500us为一周期*/
  117. sPt.u8HighPulseRatio = PWM0_Duty_Cycle; /* 高脉冲宽度 : 总脉冲宽度 = 1 : 100 */
  118. sPt.i32Inverter = 0; /*反向关闭*/

  119. /* Enable PWM clock */
  120. DrvPWM_Open();//使能PWM clock时钟函数

  121. /* Select PWM engine clock */
  122. DrvPWM_SelectClockSource(DRVPWM_TIMER0, DRVPWM_EXT_12M);

  123. /* Set PWM Timer0 Configuration */
  124. DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt); //将配置好的参数赋值寄存器函数

  125. /* Enable Output for PWM Timer0 */
  126. DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);//使能定时器输出

  127. /* Set PWM pins */
  128. DrvGPIO_InitFunction(E_FUNC_PWM01);//选出PWM的输出脚

  129. /* Enable the PWM Timer 0 */
  130. DrvPWM_Enable(DRVPWM_TIMER0, 1);//使能PWM定时器0
  131. }

  132. void delay_1s()
  133. {
  134. uint32_t i;
  135. for(i = 0; i < 200; i++)
  136. {
  137. DrvSYS_Delay(1000);
  138. }
  139. }


  140. /***************************************************************************************
  141. * Function Name : main
  142. * Create Date : 2011/12/03
  143. * Author/Corporation : 涛行天下/华东交大
  144. *
  145. * Description : 主函数
  146. *
  147. * Param :
  148. *
  149. *
  150. * Return Code : None
  151. * Global Variable : None
  152. * File Static Variable : None
  153. * Function Static Variable : None
  154. *
  155. *----------------------------------------------------
  156. * Revision History
  157. * No. Date Revised by Item Description
  158. * V0.5 2011/12/02 涛行天下 主函数 主函数
  159. ***************************************************************************************/
  160. int main (void)
  161. {
  162. Init_System(); //初始化系统

  163. Init_PWM0();//初始化PWM0

  164. DrvGPIO_Open(E_GPA,Run_Led, E_IO_OUTPUT);//程序运行指示,设置LED1OUTPUT
  165. DrvGPIO_ClrBit(E_GPA,Run_Led);//点亮LED1

  166. while(1)
  167. {
  168. uint8_t i;
  169. for(i = 0; i < 10; i++)
  170. {
  171. PWM0_Duty_Cycle += 10;//每隔一秒时间加10从而改变占空比
  172. PWMA->CMR0 = ((PWMA->CNR0))*PWM0_Duty_Cycle/100-1;//配置比较寄存器改变占空比
  173. delay_1s();//每隔一秒钟占空比改变一次
  174. }
  175. }
  176. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:技术源于积累,成功源于执着!

31

主题

366

帖子

1

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