本帖最后由 hotpower 于 2012-9-22 12:44 编辑
来过年了,正好助学板今天到了,看到上边有个能发三色光的LED圆圆的,不错,做个节日彩灯得。
NuMicro Mini51系列内嵌了一个PWM模块,特别设计用于马达控制. PWM模块共有6组PWM发生器,可以单独配置为6个独立的PWM输出, PWM0~PWM5, 或者3对互补的PWM对, (PWM0, PWM1), (PWM2, PWM3) 和 (PWM4, PWM5) ,支持3个可编程的死区发生器.
每两个PWM发生器共享一个8位预分频器. 时钟除频提供5种除频选择(1, 1/2, 1/4, 1/8, 1/16). 每个PWM输出有独立的16比特计数器控制PWM的周期,和一个独立的16比特比较器控制PWM的占空比. 6组PWM发生器提供6个独立的PWM中断标志,每个PWM中断源有独立的中断使能位. PWM发生器可以配置成one-shot模式,只产生一个PWM周期;或者配置成自动加载模式,产生连续的PWM波形
了解了PWM基本原理,加上现成库,控制它应不难.上程序/*---------------------------------------------------------------------------------------------------------*/
/* */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved. */
/* */
/*---------------------------------------------------------------------------------------------------------*/
#include "includes.h" //包含所需的头文件
/*************************************************************************************
** Function name: main
** Descriptions: 工程模板+ IO口操作
** input parameters: 无
** output parameters: 无
** Returned value: 无
*************************************************************************************/
int main (void)
{
S_DRVPWM_TIME_DATA_T sP_PWM;
Set_System(); //调用系统初始化函数
/* 初始化脉冲宽度调制器 */
DrvPWM_Open();
/* 脉冲宽度调制器计时器属性 */
sP_PWM.u8Mode = DRVPWM_AUTO_RELOAD_MODE;
sP_PWM.u8HighPulseRatio = 50; /* 高电平时间 : 完整週期 = 50 : 100 */
sP_PWM.u32Frequency = 0;
/* 设置脉冲宽度调制器计时器频率 */
sP_PWM.u8ClockSelector=DRVPWM_CLOCK_DIV_1;
sP_PWM.u8PreScale = 59;
sP_PWM.u32Duty = 200;
sP_PWM.i32Inverter = 1;
DrvPWM_SetTimerClk(DRVPWM_TIMER2, &sP_PWM);
/* 始能脉冲宽度调制器输出 */
DrvPWM_SetTimerIO(DRVPWM_TIMER2, 1);
/* 始能脉冲宽度调制器计时器 */
DrvPWM_Enable(DRVPWM_TIMER2);
DrvGPIO_InitFunction(FUNC_PWM2);
/*延时1秒钟*/
delay_ms(1000);
/*关掉PWM2*/
DrvPWM_Disable(DRVPWM_TIMER2);
DrvPWM_SetTimerClk(DRVPWM_TIMER1, &sP_PWM);
/* 始能脉冲宽度调制器输出 */
DrvPWM_SetTimerIO(DRVPWM_TIMER1, 1);
/* 始能脉冲宽度调制器计时器 */
DrvPWM_Enable(DRVPWM_TIMER1);
DrvGPIO_InitFunction(FUNC_PWM1);
delay_ms(1000);
/*关掉PWM1*/
DrvPWM_Disable(DRVPWM_TIMER1);
DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sP_PWM);
/* 始能脉冲宽度调制器输出 */
DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
/* 始能脉冲宽度调制器计时器 */
DrvPWM_Enable(DRVPWM_TIMER0);
DrvGPIO_InitFunction(FUNC_PWM0);
delay_ms(1000);
/*关掉PWM0*/
DrvPWM_Disable(DRVPWM_TIMER0);
while(1)
{
DrvPWM_Enable(DRVPWM_TIMER2);
delay_ms(1000);
/*关掉PWM2*/
DrvPWM_Disable(DRVPWM_TIMER2);
DrvPWM_Enable(DRVPWM_TIMER1);
delay_ms(1000);
/*关掉PWM1*/
DrvPWM_Disable(DRVPWM_TIMER1);
DrvPWM_Enable(DRVPWM_TIMER0);
delay_ms(1000);
/*关掉PWM0*/
DrvPWM_Disable(DRVPWM_TIMER0);
}
}
LIUpwm.rar
(570.84 KB)
|