放假一早写了个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);
}
|