打印
[新手园地]

傻瓜菜鸟第6帖——PWM

[复制链接]
5066|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
放假一早写了个PWM程序,基本每句都有注释,个人觉得还是挺清晰地,虽然是个简单的程序,不过打好基础。
NUC M0 修改PWM频率和占空比是如此简单,不错不错

1. 500HZ 波形(示波器周期1ms)


2. 200KHZ波形(1US)



最后请问下:PWM分辨率到底怎么计算呢?谢谢了
 
/**************************************************
** 文件名称:NUC120_HOT_PWM.c
** 文件说明:NUC120助学板练习程序
** 创建日期:2011-04-30
** 修改日期:
** 备    注:PWM0输出波形测试,频率为400HZ,初始占空比为50%
**************************************************/
#include <stdio.h>
#include "NUC1xx.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvSYS.h"
#include "Driver\DrvUART.h"
#include "Driver\DrvTIMER.h"
#include "Driver\DrvPWM.h"

volatile  uint8_t PWM0_Duty_Cycle = 50;          //设置占空比
/************************************************************************
** Function Name    :  UART_INT_HANDLE
** Descriptions     :  UART Callback function
** Input  parameters:  u32IntStatus
** OutPut parameters:    None
** Returned  value  :   
************************************************************************/
void Init_System(void)
{
   UNLOCKREG();                                  //寄存器锁定地址寄存器
   DrvSYS_SetOscCtrl(E_SYS_XTL12M,1);         //使能12M crystal
   
   /* Waiting for 12M Xtal stalble */
   DrvSYS_Delay(5000);
   LOCKREG();                                   //向“0x5000_0100”写入任何值,可以重锁保护寄存器
}
/************************************************************************
** Function Name    :  UART_INT_HANDLE
** Descriptions     :  UART Callback function
** Input  parameters:  u32IntStatus
** OutPut parameters:    None
** Returned  value  :   
************************************************************************/
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;
  */
  /* 自动重载模式,DRVPWM_ONE_SHOT_MODE单触发模式 */
  sPt.u8Mode              =       DRVPWM_AUTO_RELOAD_MODE;
  sPt.u8HighPulseRatio   =       PWM0_Duty_Cycle;        //高脉冲宽度
  sPt.u32Frequency         =       200000;
  sPt.i32Inverter         =       0;                      //反向关闭

  /* 打开PWM时钟并且复位pwm */
  DrvPWM_Open();
  
  /* 给多功能脚指定功能 */
  DrvGPIO_InitFunction(E_FUNC_PWM01);                             
  
  /* 这个函数可以用来选择PWM0/1和PWM2/3的时钟源 */
  DrvPWM_SelectClockSource(DRVPWM_TIMER0,DRVPWM_EXT_12M);
  
  /* 这个函数可以用来配置频率、脉冲、模式、逆转功能 */
  DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt);         //S_DRVPWM_TIME_DATA_T *sPt
  
  /* 这个函数  Enable Output for PWM Timer0  */
  DrvPWM_SetTimerIO(DRVPWM_TIMER0,1);
  /* 这个函数可以用来PWM定时器/捕获器功能  */
  DrvPWM_Enable(DRVPWM_TIMER0,1);
}
/************************************************************************
** Function Name    :  UART_INT_HANDLE
** Descriptions     :  UART Callback function
** Input  parameters:  u32IntStatus
** OutPut parameters:    None
** Returned  value  :   
************************************************************************/
int main(void)
{
Init_System();
Init_PWM0();
while(1);
}

相关帖子

沙发
maxking| | 2011-5-1 19:48 | 只看该作者
PWM是否可以实现呼吸灯的效果??

使用特权

评论回复
板凳
hotpower| | 2011-5-1 20:00 | 只看该作者
园地有一个例程

使用特权

评论回复
地板
lixupengarm| | 2011-5-23 17:45 | 只看该作者
示波器。。:lol

使用特权

评论回复
5
wangjia2000| | 2011-9-29 11:13 | 只看该作者
想问一下,频率最低可设到多少???

使用特权

评论回复
6
wangjia2000| | 2011-9-29 11:13 | 只看该作者
谢谢

使用特权

评论回复
7
零度888| | 2014-5-6 16:38 | 只看该作者
需要捕获功能,能教教吗

使用特权

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

本版积分规则

个人签名:250水王,种菜浇水,要输就输给理想,要败就败给高手。不可浮躁

7

主题

1125

帖子

1

粉丝