打印
[电路设计]

关于PWM一个寄存器(输出反向)的应用

[复制链接]
3558|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

/**************************************************
** 文件名称:NUC120_USM.c
** 文件说明:NUC120助学板练习程序
** 创建日期:2011-08-02** 修改日期:
** 备    注:PWM0输出波形测试,初始频率为40KHZ,初始占空比为30%
             按键key2按下时占空比反向(原来是30%的话,现在是70%)
    此程序仅作为学习PWM输出时的一个反向输出的一个例子,
    这是我初次接触芯唐NUC120时用过测试的,当时没有保存,
    现在把它整理出来,希望对有些人有用。
**************************************************/
#include <stdio.h>
#include "NUC1xx.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvSYS.h"
#include "Driver\DrvPWM.h"
#define  Run_Led 2    //2----LED1  3----LED2   4----LED3  5----LED4
uint8_t  flag;
/***************
**  函数声明  **
***************/
void Init_System (void);
void Init_PWM0(void);
void EINT0Callback(void);
void Init_GPIO (void);
/*****************************
** Name:      EINT0Callback
** Function:  EINT0中断服务函数
** Input:     None
** OutPut:    None
** Data:      2011-08-02
** Note:      
****************************/
void EINT0Callback(void)
{
             flag=~flag;
}

/*****************************
** Name:      Init_System
** Function:  系统初始化函数
** Input:      None
** OutPut:     None
** Data:       2011-03-17
** Note:      
****************************/
void Init_System(void)
{
/* Unlock the locked registers before access */
    UNLOCKREG(x); //寄存器锁定键地址寄存器(RegLockAddr) :有些系统控制寄存器需要被保护起来,以防止误操作而影响芯片运行,
        //这些寄存器在上电复位到用户解锁定之前是锁定的。用户可以连续依次写入“59h”, “16h” “88h”到0x5000_0100解锁定.
/* Enable the 12MHz oscillator oscillation */
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);        //SYSCLK->WRCON.XTL12M_EN = 1;
/* Waiting for 12M Xtal stable */
//while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1);  //SYSCLK->CLKSTATUS.XTL12M_STB
/*eClkSrc  - [in]  E_SYS_XTL12M / E_SYS_XTL32K / E_SYS_OSC22M / E_SYS_OSC10K / E_SYS_PLL    */
// Note: Only some of NuMicro NUC100 Series support this function.
DrvSYS_Delay(5000);

LOCKREG(x);
//向“0x5000_0100”写入任何值,就可以重锁保护寄存器
}
/*****************************
** Name:      Init_GPIO
** Function:  GPIO初始化函数
** Input:     None
** OutPut:    None
** Data:      2011-08-02
** Note:      
****************************/
void Init_GPIO (void)
{
        /*set GPI0 output*/
        DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT);                                //  设置GPA2端口为输出模式 连接LED_1
        DrvGPIO_Open(E_GPA,3, E_IO_OUTPUT);                                //  设置GPA3端口为输出模式 连接LED_2
        DrvGPIO_Open(E_GPA,4, E_IO_OUTPUT);                                //  设置GPA4端口为输出模式 连接LED_3
        DrvGPIO_Open(E_GPA,5, E_IO_OUTPUT);                                //  设置GPA5端口为输出模式 连接LED_4
        DrvGPIO_Open(E_GPB,14,E_IO_INPUT);                                //  设置GPB14端口为输入模式 连接按KEY1
        DrvGPIO_Open(E_GPB,15,E_IO_INPUT);                                //  设置GPB15端口为输入模式 连接按KEY2

    DrvGPIO_InitFunction(E_FUNC_EXTINT0);
    DrvGPIO_EnableEINT0(E_IO_FALLING, E_MODE_EDGE, EINT0Callback);
        //若设置为上升沿中断即E_IO_RISING,则在每次按键弹起时响应中断
        //若设置为下降沿中断即E_IO_FALLING,则在每次按键按下时相应中断
}

/*****************************
** Name:      Init_PWM0
** Function:  Timer0初始化函数
** Input:     None
** OutPut:    None
** Data:      2011-06-02
** Note:      
****************************/
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;
*/

/* PWM Timer property */
sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE;  /*自动重载模式    DRVPWM_ONE_SHOT_MODE为单触发模式*/
sPt.u32Frequency = 40000;      /*PWM 频率 为40KHZ*/
sPt.u8HighPulseRatio = 30;     /* 高脉冲宽度 : 总脉冲宽度 = 30 : 100 */
sPt.i32Inverter = 0;      /*反向关闭*/
/* Enable PWM clock */
    DrvPWM_Open();
            
/* Select PWM engine clock */
DrvPWM_SelectClockSource(DRVPWM_TIMER0, DRVPWM_EXT_12M);
      
/* Set PWM Timer0 Configuration */
DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt);
/* Enable Output for PWM Timer0 */
DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
/* Set PWM pins */
DrvGPIO_InitFunction(E_FUNC_PWM01);
               
/* Enable the PWM Timer 0 */
DrvPWM_Enable(DRVPWM_TIMER0, 1);
}
int main (void)
{
S_DRVPWM_TIME_DATA_T sPt;
Init_System();
Init_PWM0();
Init_GPIO ()  ;
DrvGPIO_Open(E_GPA,Run_Led, E_IO_OUTPUT);      //程序运行指示
DrvGPIO_ClrBit(E_GPA,Run_Led);
    while(1)
    {
    if(flag)
      {
   sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE;  /*自动重载模式    DRVPWM_ONE_SHOT_MODE为单触发模式*/
   sPt.u32Frequency = 40000;      /*PWM 频率 为40KHZ*/
   sPt.u8HighPulseRatio = 30;     /* 高脉冲宽度 : 总脉冲宽度 = 30 : 100 */
   sPt.i32Inverter = 1;      /*反向打开*/
   DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt);
   DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
   DrvPWM_Enable(DRVPWM_TIMER0, 1);
   }
   else
   {
   sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE;  /*自动重载模式    DRVPWM_ONE_SHOT_MODE为单触发模式*/
   sPt.u32Frequency = 40000;      /*PWM 频率 为40KHZ*/
   sPt.u8HighPulseRatio = 30;     /* 高脉冲宽度 : 总脉冲宽度 = 30 : 100 */
   sPt.i32Inverter = 0;      /*反向关闭*/
   DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt);
   DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
   DrvPWM_Enable(DRVPWM_TIMER0, 1);
   }
    }
}

P1010108.JPG (563.83 KB )

P1010108.JPG

P1010109.JPG (462.83 KB )

P1010109.JPG

P1010111.JPG (573.12 KB )

P1010111.JPG

PWM笔记一.rar

1011.63 KB

相关帖子

沙发
wang0225|  楼主 | 2011-8-3 08:14 | 只看该作者
没人顶自己先顶起来,哈哈:)

使用特权

评论回复
板凳
cecwxf| | 2011-8-3 10:22 | 只看该作者
我来顶~~~~

使用特权

评论回复
地板
hotpower| | 2011-8-3 10:41 | 只看该作者
我在开村大会。

使用特权

评论回复
5
电子write_cai| | 2011-8-4 08:22 | 只看该作者
很好啦。俺没有这个条件啊,渗得慌!

使用特权

评论回复
6
hotpower| | 2011-8-4 10:08 | 只看该作者
昨晚忘发裤子了。不错,输出极性翻转很有用的。

使用特权

评论回复
7
wang0225|  楼主 | 2011-8-5 17:18 | 只看该作者
在顶下下,哈哈

使用特权

评论回复
8
电子write_cai| | 2011-8-14 00:42 | 只看该作者
我怎么感觉程序里面的很多语句都是浪费资源。

使用特权

评论回复
9
电子write_cai| | 2011-8-14 00:43 | 只看该作者
/*****函数声明*****/
void
void
void
void
函数声明的部分直接去掉。

使用特权

评论回复
10
plc_avr| | 2011-8-14 05:55 | 只看该作者
LS的,还是加上最好,要不然顺序不对,编译不会通过的。好贴,顶一下。

使用特权

评论回复
11
wang0225|  楼主 | 2011-8-15 09:11 | 只看该作者
回电子write_cai:
      你可以把程序在精简精简,再来讨论吗?这个例子本身是想说明一个现象!
    至于/*****函数声明*****/,属于见仁见智的吧,可以根据自己的实际而定啦!

使用特权

评论回复
12
athud| | 2011-8-18 10:42 | 只看该作者
不错

使用特权

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

本版积分规则

0

主题

185

帖子

1

粉丝