[电路设计] 关于PWM一个寄存器(输出反向)的应用

[复制链接]
 楼主| wang0225 发表于 2011-8-2 19:23 | 显示全部楼层 |阅读模式

  1. /**************************************************
  2. ** 文件名称:NUC120_USM.c
  3. ** 文件说明:NUC120助学板练习程序
  4. ** 创建日期:2011-08-02** 修改日期:
  5. ** 备    注:PWM0输出波形测试,初始频率为40KHZ,初始占空比为30%
  6.              按键key2按下时占空比反向(原来是30%的话,现在是70%)
  7.     此程序仅作为学习PWM输出时的一个反向输出的一个例子,
  8.     这是我初次接触芯唐NUC120时用过测试的,当时没有保存,
  9.     现在把它整理出来,希望对有些人有用。
  10. **************************************************/
  11. #include <stdio.h>
  12. #include "NUC1xx.h"
  13. #include "Driver\DrvGPIO.h"
  14. #include "Driver\DrvSYS.h"
  15. #include "Driver\DrvPWM.h"
  16. #define  Run_Led 2    //2----LED1  3----LED2   4----LED3  5----LED4
  17. uint8_t  flag;
  18. /***************
  19. **  函数声明  **
  20. ***************/
  21. void Init_System (void);
  22. void Init_PWM0(void);
  23. void EINT0Callback(void);
  24. void Init_GPIO (void);
  25. /*****************************
  26. ** Name:      EINT0Callback
  27. ** Function:  EINT0中断服务函数
  28. ** Input:     None
  29. ** OutPut:    None
  30. ** Data:      2011-08-02
  31. ** Note:      
  32. ****************************/
  33. void EINT0Callback(void)
  34. {
  35.              flag=~flag;
  36. }

  37. /*****************************
  38. ** Name:      Init_System
  39. ** Function:  系统初始化函数
  40. ** Input:      None
  41. ** OutPut:     None
  42. ** Data:       2011-03-17
  43. ** Note:      
  44. ****************************/
  45. void Init_System(void)
  46. {
  47. /* Unlock the locked registers before access */
  48.     UNLOCKREG(x); //寄存器锁定键地址寄存器(RegLockAddr) :有些系统控制寄存器需要被保护起来,以防止误操作而影响芯片运行,
  49.         //这些寄存器在上电复位到用户解锁定之前是锁定的。用户可以连续依次写入“59h”, “16h” “88h”到0x5000_0100解锁定.
  50. /* Enable the 12MHz oscillator oscillation */
  51. DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);        //SYSCLK->WRCON.XTL12M_EN = 1;
  52. /* Waiting for 12M Xtal stable */
  53. //while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1);  //SYSCLK->CLKSTATUS.XTL12M_STB
  54. /*eClkSrc  - [in]  E_SYS_XTL12M / E_SYS_XTL32K / E_SYS_OSC22M / E_SYS_OSC10K / E_SYS_PLL    */
  55. // Note: Only some of NuMicro NUC100 Series support this function.
  56. DrvSYS_Delay(5000);

  57. LOCKREG(x);
  58. //向“0x5000_0100”写入任何值,就可以重锁保护寄存器
  59. }
  60. /*****************************
  61. ** Name:      Init_GPIO
  62. ** Function:  GPIO初始化函数
  63. ** Input:     None
  64. ** OutPut:    None
  65. ** Data:      2011-08-02
  66. ** Note:      
  67. ****************************/
  68. void Init_GPIO (void)
  69. {
  70.         /*set GPI0 output*/
  71.         DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT);                                //  设置GPA2端口为输出模式 连接LED_1
  72.         DrvGPIO_Open(E_GPA,3, E_IO_OUTPUT);                                //  设置GPA3端口为输出模式 连接LED_2
  73.         DrvGPIO_Open(E_GPA,4, E_IO_OUTPUT);                                //  设置GPA4端口为输出模式 连接LED_3
  74.         DrvGPIO_Open(E_GPA,5, E_IO_OUTPUT);                                //  设置GPA5端口为输出模式 连接LED_4
  75.         DrvGPIO_Open(E_GPB,14,E_IO_INPUT);                                //  设置GPB14端口为输入模式 连接按KEY1
  76.         DrvGPIO_Open(E_GPB,15,E_IO_INPUT);                                //  设置GPB15端口为输入模式 连接按KEY2

  77.     DrvGPIO_InitFunction(E_FUNC_EXTINT0);
  78.     DrvGPIO_EnableEINT0(E_IO_FALLING, E_MODE_EDGE, EINT0Callback);
  79.         //若设置为上升沿中断即E_IO_RISING,则在每次按键弹起时响应中断
  80.         //若设置为下降沿中断即E_IO_FALLING,则在每次按键按下时相应中断
  81. }

  82. /*****************************
  83. ** Name:      Init_PWM0
  84. ** Function:  Timer0初始化函数
  85. ** Input:     None
  86. ** OutPut:    None
  87. ** Data:      2011-06-02
  88. ** Note:      
  89. ****************************/
  90. void Init_PWM0(void)
  91. {
  92. S_DRVPWM_TIME_DATA_T sPt;
  93. /*
  94. 声明 PWM Timer设置的结构体 位于DRVPWM.H
  95. 结构体如下:
  96. typedef struct
  97. {
  98.   uint8_t   u8Mode;
  99.   uint8_t   u8HighPulseRatio;
  100.   uint8_t   u8ClockSelector;
  101.   uint8_t   u8PreScale;
  102.   uint32_t     u32Frequency;
  103.   uint32_t     u32Duty;
  104.    int32_t   i32Inverter;
  105. }S_DRVPWM_TIME_DATA_T;
  106. */

  107. /* PWM Timer property */
  108. sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE;  /*自动重载模式    DRVPWM_ONE_SHOT_MODE为单触发模式*/
  109. sPt.u32Frequency = 40000;      /*PWM 频率 为40KHZ*/
  110. sPt.u8HighPulseRatio = 30;     /* 高脉冲宽度 : 总脉冲宽度 = 30 : 100 */
  111. sPt.i32Inverter = 0;      /*反向关闭*/
  112. /* Enable PWM clock */
  113.     DrvPWM_Open();
  114.             
  115. /* Select PWM engine clock */
  116. DrvPWM_SelectClockSource(DRVPWM_TIMER0, DRVPWM_EXT_12M);
  117.       
  118. /* Set PWM Timer0 Configuration */
  119. DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt);
  120. /* Enable Output for PWM Timer0 */
  121. DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
  122. /* Set PWM pins */
  123. DrvGPIO_InitFunction(E_FUNC_PWM01);
  124.                
  125. /* Enable the PWM Timer 0 */
  126. DrvPWM_Enable(DRVPWM_TIMER0, 1);
  127. }
  128. int main (void)
  129. {
  130. S_DRVPWM_TIME_DATA_T sPt;
  131. Init_System();
  132. Init_PWM0();
  133. Init_GPIO ()  ;
  134. DrvGPIO_Open(E_GPA,Run_Led, E_IO_OUTPUT);      //程序运行指示
  135. DrvGPIO_ClrBit(E_GPA,Run_Led);
  136.     while(1)
  137.     {
  138.     if(flag)
  139.       {
  140.    sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE;  /*自动重载模式    DRVPWM_ONE_SHOT_MODE为单触发模式*/
  141.    sPt.u32Frequency = 40000;      /*PWM 频率 为40KHZ*/
  142.    sPt.u8HighPulseRatio = 30;     /* 高脉冲宽度 : 总脉冲宽度 = 30 : 100 */
  143.    sPt.i32Inverter = 1;      /*反向打开*/
  144.    DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt);
  145.    DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
  146.    DrvPWM_Enable(DRVPWM_TIMER0, 1);
  147.    }
  148.    else
  149.    {
  150.    sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE;  /*自动重载模式    DRVPWM_ONE_SHOT_MODE为单触发模式*/
  151.    sPt.u32Frequency = 40000;      /*PWM 频率 为40KHZ*/
  152.    sPt.u8HighPulseRatio = 30;     /* 高脉冲宽度 : 总脉冲宽度 = 30 : 100 */
  153.    sPt.i32Inverter = 0;      /*反向关闭*/
  154.    DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt);
  155.    DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
  156.    DrvPWM_Enable(DRVPWM_TIMER0, 1);
  157.    }
  158.     }
  159. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| wang0225 发表于 2011-8-3 08:14 | 显示全部楼层
没人顶自己先顶起来,哈哈:)
cecwxf 发表于 2011-8-3 10:22 | 显示全部楼层
我来顶~~~~
hotpower 发表于 2011-8-3 10:41 | 显示全部楼层
我在开村大会。
电子write_cai 发表于 2011-8-4 08:22 | 显示全部楼层
很好啦。俺没有这个条件啊,渗得慌!
hotpower 发表于 2011-8-4 10:08 | 显示全部楼层
昨晚忘发裤子了。不错,输出极性翻转很有用的。
 楼主| wang0225 发表于 2011-8-5 17:18 | 显示全部楼层
在顶下下,哈哈
电子write_cai 发表于 2011-8-14 00:42 | 显示全部楼层
我怎么感觉程序里面的很多语句都是浪费资源。
电子write_cai 发表于 2011-8-14 00:43 | 显示全部楼层
/*****函数声明*****/
void
void
void
void
函数声明的部分直接去掉。
plc_avr 发表于 2011-8-14 05:55 | 显示全部楼层
LS的,还是加上最好,要不然顺序不对,编译不会通过的。好贴,顶一下。
 楼主| wang0225 发表于 2011-8-15 09:11 | 显示全部楼层
回电子write_cai:
      你可以把程序在精简精简,再来讨论吗?这个例子本身是想说明一个现象!
    至于/*****函数声明*****/,属于见仁见智的吧,可以根据自己的实际而定啦!
athud 发表于 2011-8-18 10:42 | 显示全部楼层
不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

185

帖子

1

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