#include "PWM.h"
#define EN_EXT_OSC 0
#define COMPLEMENT_MODE 0x00000020
#define DEAD_ZONE_INTERVAL 0xC8FF0000
#define PWM_ENABLE 0x01010101
#if EN_EXT_OSC
#define PWM_CLOCK_SOURCE 0x00000000 //使用外部振荡12MHz
#else
#define PWM_CLOCK_SOURCE 0xF0000000 //使用内部RC振荡22.1184MHz
#endif
#define PWM_PRESCALAE 0x0000C731 //PWM01预分频0x31(49),PWM23预分频0xC7(199)
#define PWM_CLOCK_DIVIDER 0x00004444 //输入时钟分频1
#define PWM_OUTPUT_INVERT 0x00040000
#define PWM_OUTPUT_ENABLE 0x0000000F //PWM0、1、2、3输出使能
#define PWM_CMR_VALUE 0x0
#define PWM_CNR_VALUE 0x1000 //4096
/*
PWM频率=PWMxy_CLK/(prescale+1)*(clock divider)/(CNR+1)
(1)使用外部晶振12MHz
PWM频率=12000000/(49+1)*4097 =58.57Hz
(2)使用内部RC振荡22.1184MHz
PWM频率=22118400/(49+1)*4097 =107.97Hz
*/
#define LED_DARKING 0
#define LED_BRIGHTING 1
STATIC UINT32 g_unPWMCMRValue=PWM_CNR_VALUE;
STATIC UINT32 g_unLedStat=LED_DARKING;
/****************************************
*函数名称:PWMInit
*输 入:无
*输 出:无
*功 能:PWM初始化
******************************************/
VOID PWMInit(VOID)
{
P2_MFP |= ~(P20_AD8_PWM0 | P21_AD9_PWM1 | P22_AD10_PWM2 | P23_AD11_PWM3);
P2_MFP |= (PWM0 | PWM1 | PWM2 | PWM3); //使能P2.0~P2.3为PWM输出
P2_PMD &= ~Px0_PMD; //配置P2.0~P2.3为推挽输出
P2_PMD |= Px0_OUT;
P2_PMD &= ~Px1_PMD;
P2_PMD |= Px1_OUT;
P2_PMD &= ~Px2_PMD;
P2_PMD |= Px2_OUT;
P2_PMD &= ~Px3_PMD;
P2_PMD |= Px3_OUT;
APBCLK |= PWM01_CLKEN | PWM23_CLKEN; //使能PWM0~3时钟
CLKSEL1 = PWM_CLOCK_SOURCE; //选择PWM0~3时钟源
PPRA = PWM_PRESCALAE | DEAD_ZONE_INTERVAL; //选择PWM0~3时钟预分频和死区间隔
CSRA = PWM_CLOCK_DIVIDER; //选择PWM0~3时钟分频
PCRA = 0x08080808 | PWM_OUTPUT_INVERT | COMPLEMENT_MODE; //PWM0~3自动重装载
CNR0A = CNR1A = CNR2A = CNR3A = PWM_CNR_VALUE; //PWM0~3计数值
CMR0A = CMR1A = CMR2A = CMR3A = PWM_CMR_VALUE; //PWM0~3比较值
PIERA |= PWMIE3 | PWMIE2 | PWMIE1 | PWMIE0 ; //使能PWM0~3中断
NVIC_ISER |= PWMA_INT; //使能PWM0~3中断
POEA = PWM_OUTPUT_ENABLE; //PWM输出使能
PCRA |= PWM_ENABLE; //PWM使能,启动
}
/****************************************
*函数名称:PWMA_IRQHandler
*输 入:无
*输 出:无
*功 能:中断服务函数-PWMA
******************************************/
VOID PWMA_IRQHandler(VOID)
{
switch(g_unLedStat) //检查LED状态
{
case LED_DARKING: //LED状态渐暗
{
if(g_unPWMCMRValue < PWM_CNR_VALUE)
{
g_unPWMCMRValue+=50;
}
else
{
g_unLedStat = LED_BRIGHTING;
g_unPWMCMRValue=PWM_CNR_VALUE;
}
}break;
case LED_BRIGHTING: //LED状态渐亮
{
if(g_unPWMCMRValue>=50)
{
g_unPWMCMRValue-=50;
}
else
{
g_unLedStat = LED_DARKING;
g_unPWMCMRValue=PWM_CMR_VALUE;
}
}break;
default:break;
}
CMR0A = CMR1A = CMR2A = CMR3A = g_unPWMCMRValue; //设置PWM0~3比较值
PIIRA = PIIRA;
}
/****************************************
*函数名称:main
*输 入:无
*输 出:无
*功 能:函数主体
******************************************/
INT32 main(VOID)
{
PROTECT_REG //ISP下载时保护FLASH存储器
(
PWRCON |= XTL12M_EN; //默认时钟源为外部晶振
while((CLKSTATUS & XTL12M_STB) == 0); //等待12MHz时钟稳定
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟
PWMInit(); //PWM初始化
)
while(1);
}
关键字:新唐M051 pwm
引用地址:
新唐M051 pwm使用程序
推荐阅读最新更新时间:2024-03-16 13:48
PWM变换器中输出变压器偏磁的抑制
摘要:分析了PWM开关型变换器中,变压器直流偏磁问题产生的原因。给出了一种解决直流偏磁较为实用的拓扑电路,并分析了它的工作原理。该电路的有效性在20kHz/2kW的全桥逆变电源中得到了验证。 关键词:变换器;偏磁;脉宽调制 引言 在PWM开关型变换器中,或多或少都存在着变压器直流偏磁问题,只是在不同的场合严重程度不同而已。偏磁的后果是十分严重的,轻则会使变压器和功率半导体模块的功耗增加,温升加剧,严重时还会损坏功率模块,使其不能正常工作。PWM控制的全桥逆变电源,经常会因各种不可预见的因素,使其两桥端输出电压脉冲列在基波周期内正负伏秒值不相等,从而导致输出变压器中存在直流分量,引起单向偏磁现象,严重威胁到系统的正常运行。为了防止或减
[电源管理]
STM32F103ZET6 用定时器级联方式输出特定数目的PWM
STM32F103ZET6里共有8个定时器,其中高级定时器有TIM1-TIM5、TIM8,共6个。 这里需要使用定时器的级联功能,ST的RM0008 REV12的P388和P399页上有说明对于特定的定时器,怎么去选择级联功能,参见表86。 我这里输出PWM的定时器是TIM2,空闲的定时器是TIM3。以TIM2为主定时器,TIM3为从定时器对TIM2的输出脉冲数进行计数。 查表可知,TIM3为从定时器选择TIM2为触发源,需要配置TS=001,即选择ITR1。 实现通过定时器控制输出PWM个数的功能,可以有如下一种配置方式: void TIM2_Master__TIM3_Slave_Configuration(u32 Puls
[单片机]
单片机PWM调节LED灯亮度
刚搞完飞思卡尔智能车,昨天我一起做车的搭档跑来跟我说魏老师(我们系的前主任,不知道他们怎么认识的....)叫他帮忙做个可通过无线遥控调节LED灯亮度的设计方案,问我有没有兴趣做做,主要是魏老师也是受他以前的老同学(合工大的....)所托,他自己估计没怎么搞过这个,开始自己不敢接,很担心自己不会做,自己几斤几两自己还不清楚,呵呵,后来实在央求不过,算了,做就做吧,还以为是什么大项目...了解了才知道,我能需要做的很简单,只要通过无线按键控制增减调节灯得亮度,甚至只要通过按键实现一定范围变化的模拟变化量输出就OK了,回来上网搜索了一些资料,昨晚花了一晚上的时间写了一个很简单的通过单片机PWM调节LED灯亮度的代码,估计我想通过调节灯得亮
[单片机]
STM8S103定时器1,定时器2多路PWM波输出
一、时钟配置 1、STM8S的4种时钟源可用做主时钟: ● 1-24MHz高速外部晶体振荡器(HSE) ● 最大24MHz高速外部时钟信号(HSE user-ext) ● 16MHz高速内部RC振荡器(HSI) ● 128KHz低速内部RC(LSI) STM8默认时钟源为16MHz高速内部RC振荡器(HSI) 对 CLK_CKDIVR设置可以设置时钟为HSI的分频 如 CLK_CKDIVR|= (uint8_t)0x00;/*设置时钟为内部16M高速时钟*/ 2分频为 CLK_CKDIVR=0x08;4分频为 CLK_CKDIVR=0x10;8分频为 CLK_CKDIVR=0x18; 二、定时器1设置
[单片机]
MSL2164:16串LED驱动器设计指南详解
MSL2164和MSL2166器件以高电流精度和LED串匹配来驱动外部MOSFET, 这些器件具有爱特梅尔LED驱动器产品系列中最宽的调光分辨率,能够提高对比度,与其它解决方案相比,功耗降低至少20%。 过去,TV OEM厂商必须计算合适的参数,以便有效地照亮所要求的显示屏背光区域。LED驱动器将生成算法以设置合适的LED串相位,优化背光与LCD面板的同步。 OEM厂商必须经常执行附加算法以调节LED串相位,确保背光在帧刷新期间完全同步。MSL2164和MSL2166具有多种脉宽调制(PWM)模式, 包括正向、逆向、拖尾和中心,由于新器件中集成了定时算法,设计复杂性得以降低,这确保背光在所有LCD像素已经稳定的最佳时刻照亮。
[电源管理]
40W全电压数字式离线PWM LED驱动方案解析
iW3620 使用 iWatt 的专利 PrimAccurate 一次侧控制技术,由于不再需要传统的光隔离器和外部补偿元件,因此减少了外部元件数量,从而缩小了产品尺寸并降低了成本。该设备通过在准谐振模式下工作来优化高负载时的效率,并使用逐脉冲波形分析来提供优于传统离线解决方案的环路响应特性。iW3620 具有全面的保护功能,并集成了iWatt的EZ-EMI技术,可以帮助实现最终应用中的EMI 管理,从而为最终用户提供了一个易于设计且可靠的固态照明解决方案。 典型应用原理图 特性 PrimAccurate - 隔离型离线交流/直流控制器 可轻松满足电磁干扰国际标准的 EZ-EMI 设计 非常适合于最大功率为40W
[电源管理]
基于tiny4412的Linux内核移植 -- PWM子系统学习(八)
平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) 实验二、用蜂鸣器测试backlight 一般LCD的背光的亮度调节都是通过控制输入给背光控制
[单片机]
基于ARM单片机 LPC2214的在线式UPS硬件设计
1 概 述 目前UPS主要发展方向有两个:一是新的功能不断加强,例如增加远程监视、自动诊断、识别、事件记录、故障警告等功能;二是自身效率的提高。采用高效率的IC芯片和新的制造工艺,使空载功耗不断地降低,功率密度进一步提高。紧凑密集的空间设计给小型电子设备的应用带来了新的解决方案。 将功能强大的嵌入式微处理器(本文选用LPC2214)系统引入UPS,可以增强UPS的功能,使其具有网络化、智能化的特性,满足许多无人职守基站的用电要求。用数字控制代替模拟控制,可以消除温漂、老化等模拟器件存在的问题;抗干扰能力强,有利于参数整定和调节;通用性强,便于通过改变程序软件方便地调整方案和实现多种新型控制策略;同时高度集成的数字电路可
[电源管理]