打印
[MINI51]

mini51学习第三贴 PWM调光灯+TIMER

[复制链接]
3646|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cnjxlxp|  楼主 | 2012-2-3 19:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hotpower 于 2012-9-22 12:54 编辑

根据助学园地的PWM例子改编而成,园地的例子使用PWM过程中没有改变占空比,于是学习了一下并且加入改变占空比部分,实现PWM调光功能。。。
 
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include "includes.h"  //°üº¬ËùÐèµÄÍ·Îļþ
uint8_t duty=99;
S_DRVPWM_TIME_DATA_T sP_PWM;
int8_t flag;
void TMR0_Callback(void)
{
if(duty == 0)
duty=99;
duty--;
PWM->CMR2 = (duty * PWM->CNR2) / 100;//change duty
   flag = ~flag;
   if(flag)
   {
       DrvGPIO_SetBit(E_PORT3, 1);  //LED0-OFF
       DrvGPIO_SetBit(E_PORT3, 6);  //LED1-OFF
    DrvGPIO_SetBit(E_PORT5, 2);  //LED2-OFF
       DrvGPIO_SetBit(E_PORT2, 6);  //LED3-OFF
   }
   else
   {
       DrvGPIO_ClrBit(E_PORT3, 1);  //LED0-ON
       DrvGPIO_ClrBit(E_PORT3, 6);  //LED1-ON
       DrvGPIO_ClrBit(E_PORT5, 2);  //LED2-ON
       DrvGPIO_ClrBit(E_PORT2, 6);  //LED3-ON
   }
}
int main (void)
{
Set_System();     
    DrvGPIO_InitFunction(FUNC_PWM2);
DrvPWM_Open();
sP_PWM.u8Mode = DRVPWM_AUTO_RELOAD_MODE;
sP_PWM.u8HighPulseRatio = 99;      
sP_PWM.u32Frequency =100;
sP_PWM.i32Inverter = 0;
DrvPWM_SetTimerClk(DRVPWM_TIMER2, &sP_PWM);//use method1
DrvPWM_SetTimerIO(DRVPWM_TIMER2, 1);
DrvPWM_Enable(DRVPWM_TIMER2);

while(1)
{
  ;
}

}

 
#include "includes.h"  //°üº¬ËùÐèµÄÍ·Îļþ
void timer_init(void);
/*************************************************************************************
** Function name:       Set_System
** Descriptions:        ·âװһЩ³õʼ»¯Ä£¿é
** input parameters:    none
** output parameters:   none
** Returned value:      none
*************************************************************************************/
void Set_System(void)
{
  RCC_Configuration();     //ÅäÖÃϵͳʱÖÓ
  GPIO_Configuration();     //ÅäÖÃGPIO
  timer_init();
}
/*************************************************************************************
** Function name:       RCC_Configuration
** Descriptions:        ÏµÍ³Ê±ÖÓÔ´ÉèÖÃ
** input parameters:    none
** output parameters:   none
** Returned value:      none
*************************************************************************************/
void RCC_Configuration(void)
{
   UNLOCKREG();            // ¶Ôд±£»¤Î»²Ù×÷ʱ ÐèÒªÒ»´ÎÏò0x50000 0100дÈë 0x59,0x16,0x88
   DrvSYS_Open(XTL_CLK);         // Enable high external clock and use it as system clock (HCLK)
   while (DrvSYS_GetChipClockSourceStatus(XTL_CLK) != 1);  //µÈ´ýÍⲿ12MHZ¾§Õñ¾ÍÐ÷
   LOCKREG();                          // Ïò¡°0x5000_0100¡±Ð´ÈëÈκÎÖµ£¬¾Í¿ÉÒÔÖØËø±£»¤¼Ä´æÆ÷
}
/*************************************************************************************
** Function name:       GPIO_Configuration
** Descriptions:        GPIOÅäÖÃ
** input parameters:    none
** output parameters:   none
** Returned value:      none
*************************************************************************************/
void GPIO_Configuration()
{
    DrvGPIO_Open(E_PORT3, E_PIN1, E_IO_OUTPUT);    //LED0
DrvGPIO_Open(E_PORT3, E_PIN6, E_IO_OUTPUT);    //LED1
    DrvGPIO_Open(E_PORT5, E_PIN2, E_IO_OUTPUT);    //LED2
DrvGPIO_Open(E_PORT2, E_PIN6, E_IO_OUTPUT);    //LED3
}
/*************************************************************************************
** Function name:       delay_ms
** Descriptions:        1ms(¾§ÕñΪ12MHZ)ÑÓʱ×Ó³ÌÐò
** input parameters:    count
** output parameters:   none
** Returned value:      none
*************************************************************************************/
void delay_ms(uint32_t count)
{
    uint32_t i,j;
for(i=count;i>0;i--)
    for(j=2395;j>0;j--);
}
void timer_init(void)
{
  DrvTIMER_Init();
  DrvTIMER_Open(E_TMR0, 1000, E_PERIODIC_MODE); //1000/s
  DrvTIMER_SetTimerEvent(E_TMR0, 100, (TIMER_CALLBACK)TMR0_Callback, 0);//100ms
  DrvTIMER_EnableInt(E_TMR0);
  DrvTIMER_Start(E_TMR0);
}

PWM TIMER2.rar

657.7 KB

相关帖子

沙发
xlhtracy| | 2012-2-6 12:46 | 只看该作者
:D收藏啦

使用特权

评论回复
板凳
hanfei69882| | 2012-3-29 23:10 | 只看该作者
支持一下

使用特权

评论回复
地板
[惊涛骇浪]| | 2012-5-18 09:46 | 只看该作者
支持MINI51

使用特权

评论回复
5
jstele| | 2013-1-26 11:16 | 只看该作者
學者一下  有要用到

使用特权

评论回复
6
a437916817| | 2013-4-5 21:49 | 只看该作者
学习

使用特权

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

本版积分规则

0

主题

46

帖子

2

粉丝