放假一早写了个PWM程序,基本每句都有注释,个人觉得还是挺清晰地,虽然是个简单的程序,不过打好基础。
NUC M0 修改PWM频率和占空比是如此简单,不错不错
1. 500HZ 波形(示波器周期1ms)
2. 200KHZ波形(1US)
最后请问下:PWM分辨率到底怎么计算呢?谢谢了-
- /**************************************************
- ** 文件名称:NUC120_HOT_PWM.c
- ** 文件说明:NUC120助学板练习程序
- ** 创建日期:2011-04-30
- ** 修改日期:
- ** 备 注:PWM0输出波形测试,频率为400HZ,初始占空比为50%
- **************************************************/
- #include <stdio.h>
- #include "NUC1xx.h"
- #include "Driver\DrvGPIO.h"
- #include "Driver\DrvSYS.h"
- #include "Driver\DrvUART.h"
- #include "Driver\DrvTIMER.h"
- #include "Driver\DrvPWM.h"
- volatile uint8_t PWM0_Duty_Cycle = 50; //设置占空比
- /************************************************************************
- ** Function Name : UART_INT_HANDLE
- ** Descriptions : UART Callback function
- ** Input parameters: u32IntStatus
- ** OutPut parameters: None
- ** Returned value :
- ************************************************************************/
- void Init_System(void)
- {
- UNLOCKREG(); //寄存器锁定地址寄存器
- DrvSYS_SetOscCtrl(E_SYS_XTL12M,1); //使能12M crystal
-
- /* Waiting for 12M Xtal stalble */
- DrvSYS_Delay(5000);
- LOCKREG(); //向“0x5000_0100”写入任何值,可以重锁保护寄存器
- }
- /************************************************************************
- ** Function Name : UART_INT_HANDLE
- ** Descriptions : UART Callback function
- ** Input parameters: u32IntStatus
- ** OutPut parameters: None
- ** Returned value :
- ************************************************************************/
- void Init_PWM0(void)
- {
- S_DRVPWM_TIME_DATA_T sPt;
- /*
- 声明 PWM Timer设置的结构体 位于DRVPWM.H
- 结构体如下:
- typedef struct
- {
- uint8_t u8Mode;
- uint8_t u8HighPulseRatio;
- uint8_t u8ClockSelector;
- uint8_t u8PreScale;
- uint32_t u32Frequency;
- uint32_t u32Duty;
- int32_t i32Inverter;
- }S_DRVPWM_TIME_DATA_T;
- */
- /* 自动重载模式,DRVPWM_ONE_SHOT_MODE单触发模式 */
- sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE;
- sPt.u8HighPulseRatio = PWM0_Duty_Cycle; //高脉冲宽度
- sPt.u32Frequency = 200000;
- sPt.i32Inverter = 0; //反向关闭
- /* 打开PWM时钟并且复位pwm */
- DrvPWM_Open();
-
- /* 给多功能脚指定功能 */
- DrvGPIO_InitFunction(E_FUNC_PWM01);
-
- /* 这个函数可以用来选择PWM0/1和PWM2/3的时钟源 */
- DrvPWM_SelectClockSource(DRVPWM_TIMER0,DRVPWM_EXT_12M);
-
- /* 这个函数可以用来配置频率、脉冲、模式、逆转功能 */
- DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt); //S_DRVPWM_TIME_DATA_T *sPt
-
- /* 这个函数 Enable Output for PWM Timer0 */
- DrvPWM_SetTimerIO(DRVPWM_TIMER0,1);
- /* 这个函数可以用来PWM定时器/捕获器功能 */
- DrvPWM_Enable(DRVPWM_TIMER0,1);
- }
- /************************************************************************
- ** Function Name : UART_INT_HANDLE
- ** Descriptions : UART Callback function
- ** Input parameters: u32IntStatus
- ** OutPut parameters: None
- ** Returned value :
- ************************************************************************/
- int main(void)
- {
- Init_System();
- Init_PWM0();
- while(1);
- }
|