本帖最后由 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);
- }
- }
|