打印
[MINI51]

ddllxxrrMiNi51学习第二贴:PWM实现节日彩灯

[复制链接]
3359|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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)

相关帖子

沙发
Swallow_0322| | 2012-1-15 07:50 | 只看该作者
已经开始玩了,顶!

使用特权

评论回复
板凳
plc_avr| | 2012-1-15 10:38 | 只看该作者
有6路PWM,但主时钟没有倍频,分辩率太低,12M时钟最快也只能输出3M的脉冲,如果能再高点就好了。

使用特权

评论回复
地板
mcs8098| | 2012-1-15 10:41 | 只看该作者
支持

使用特权

评论回复
5
lixiaoxu2meng| | 2012-1-15 14:39 | 只看该作者

使用特权

评论回复
6
Ryanhsiung| | 2012-1-15 18:28 | 只看该作者
有6路PWM,但主时钟没有倍频,分辩率太低,12M时钟最快也只能输出3M的脉冲,如果能再高点就好了。
plc_avr 发表于 2012-1-15 10:38

高速就要用DSP了

使用特权

评论回复
7
yulri| | 2012-2-9 14:16 | 只看该作者
记下了,好东西啊!!!

使用特权

评论回复
8
a437916817| | 2013-4-10 09:56 | 只看该作者
学习了

使用特权

评论回复
9
TWO__PIECE| | 2013-4-24 14:31 | 只看该作者
你好啊~因为毕业设计~我刚接触这个学习板~下载你的程序~MDK编译什么的都没有问题~但是下载失败~弹出target dll has been cancelled这个错误

请问是什么原因?~nu link驱动没装好?还是主板需要独立电源供电?还是其他什么原因?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2399

主题

6963

帖子

68

粉丝