欢迎来到 阿仪网

免费注册

首页|产品|求购|资讯|专题|找厂商|打听|品牌|资料|技术文献|展会|新品|促销|招标|优质仪器
广告

华大单片机定时器输出0~100%占空比方法

提供者:沈阳芯硕科技有限公司   发布时间:2022/8/18 9:22:20  阅读次数:69次  进入该公司店铺

商家名片
宣**
请说明是阿仪网看到我的,谢谢!
  • 公司:沈阳芯硕科技有限公司
  • 电话:02*******900
  • 手机:18******453
  • 微信:***
  • 交换名片后展示联系方式

交换名片

华大单片机可以通过种方式进行PWM输出,工程师反应使用定时器输出PWM的时候,不能输出占空比为0或100%的波形。这时由于定时器输出PWM时设置会比较特殊,下面进行相关的介绍。


定时器进行PWM输出时,波形主要由下面几个寄存器的值来决定:
PCONR.PERCx(x=A/B) : CHA和CHB的周期匹配时,输出电平状态,设置的是PWM周期结束后电平状态;
PCONR.CMPCx(x=A/B): CHA和CHB的比较匹配时,输出电平状态,设置的是计数到计数点后电平的状态;
PCONR.STASTPSx(x=A/B):CHA和CHB的起始和停止电平选择;
PCONR.STACx(x=A/B): 计数开始时CHA和CHB电平状态,PWM开始端口的电平状态;
PCONR.STPCx(x=A/B):计数结束时CHA和CHB电平状态,PWM停止后端口的电平状态;
两个寄存器用来设置PWM输出周期的波形,后三个寄存器用来设置PWM开始和结束时端口的电平。

本文开头提到的问题通过设置两个寄存器就可以实现。下面以起始低电平,计数匹配后高电平的PWM波形来说明。起始低电平说明PWM周期匹配后,新的周期开始时端口的电平为低电平,需要把PCONR.PERCx设置为低电平;计数匹配后为高电平,把PCONR.CMPCx设置为高电平就可以。这样的设置可以输出0~(<100%)占空比的波形。100%这点需要始终是高电平,也就是说周期匹配的时候不能输出低电平,设置为低电平的话,当周期匹配的时候会立刻输出一个低电平,再进行比较匹配的判断,匹配分输出高电平,这样就存在一个很小的低电平脉冲,不是我们所需要的。

当要输出100%占空比的时候,要把PCONR.PERCx设置为高电平,这样就周期匹配的时候会输出高电平,不会再有低电平脉冲。当占空比不是100%的时候,再把PCONR.PERCx设置回低电平就可以。

以华大单片机HC32F003芯片TIM4定时器CHA通道为例,每一改变增加10%占空比,输出100%后,占空比改为0输出。代码部分如下:

int32_t main(void)

{

float fPwmDyty = 0.0;

en_adt_unit_t enAdt;

uint16_t u16Period;

en_adt_compare_t enAdtCompare;

uint16_t u16Compare;

stc_adt_basecnt_cfg_t stcAdtBaseCntCfg;

stc_adt_CHxX_port_cfg_t stcAdtTIM4ACfg;

DDL_ZERO_STRUCT(stcAdtBaseCntCfg);

DDL_ZERO_STRUCT(stcAdtTIM4ACfg);

Clk_SetPeripheralGate(ClkPeripheralGpio, TRUE); //端口外设时钟使能

Gpio_SetFunc_TIM4_CHA_P23();

Clk_SetPeripheralGate(ClkPeripheralAdt, TRUE); //ADT外设时钟使能

enAdt = AdTIM4;

Adt_SCount(enAdt);

Adt_ClearCount(enAdt);

stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode; //ADT载波为三角波

stcAdtBaseCntCfg.enCntDir = AdtCntUp; //向上计数

stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0Div8; //PCLK8分频

Adt_Init(enAdt, &stcAdtBaseCntCfg); //ADT载波、计数模式、时钟配置

u16Period = 0xEEEE;

Adt_SetPeriod(enAdt, u16Period); //设置PWM周期

enAdtCompare = AdtCompareA;

u16Compare = 0xEEEE;

Adt_SetCompareValue(enAdt, enAdtCompare, u16Compare); //设置CHA通道PWM低电平时间

enAdtCompare = AdtCompareC;

u16Compare = 0xEEEE;

Adt_SetCompareValue(enAdt, enAdtCompare, u16Compare); //设置CHA通道比较缓存值

Adt_EnableValueBuf(enAdt, AdtCHxA, TRUE); //使能CHA通道缓存输出

stcAdtTIM4ACfg.enCap = AdtCHxCompareOutput; //比较输出

stcAdtTIM4ACfg.bOutEn = TRUE; //端口输出使能

stcAdtTIM4ACfg.enPerc = AdtCHxPeriodLow; //周期匹配时输出低电平

stcAdtTIM4ACfg.enCmpc = AdtCHxCompareHigh; //比较匹配时输出高电平

stcAdtTIM4ACfg.enStaStp = AdtCHxStateSelSS; //计数开始或停止时,CHA端口输出由STACB、STPCB决定

stcAdtTIM4ACfg.enStaOut = AdtCHxPortOutLow; //计数开始时CHA端口输出设定为低电平

stcAdtTIM4ACfg.enStpOut = AdtCHxPortOutLow; //计数停止时CHA端口输出设定为低电平

Adt_CHxXPortConfig(enAdt, AdtCHxA, &stcAdtTIM4ACfg); //端口CHA配置

Adt_StartCount(enAdt); //开启ADT

while(1)

{

delay1ms(1000);

if(fPwmDyty < 1) //占空比小于100%,将占空比加10%

{

fPwmDyty += 0.1;

}

else //占空比大于等于100%,将占空比设置为0%

{

fPwmDyty = 0;

}

if (fPwmDyty < 1) //占空比小于100%,将计数周期结束时输出设置为低

{

M0P_ADT0->PCONR_f.PERCA = 0;

}

else //占空比大于等于100%,将计数周期结束时输出设置为高

{

M0P_ADT0->PCONR_f.PERCA = 1;

}

Adt_SetCompareValue(AdTIM4, AdtCompareC, (1-fPwmDyty)*u16Period);

}

}

优质商品

X射线荧光光谱仪
X射线荧光光谱仪

版权声明

① 凡本网注明"来源:阿仪网"的所有作品,版权均属于阿仪网,未经本网授权不得转载、摘编或利 用其它方式使用。已获本网授 权的作品,应在授权范围内使用,并注明"来源:阿仪网"。违者本网将追究相关法律责任。

② 本信息由注册会员:沈阳芯硕科技有限公司发布并且负责版权等法律责任。

旗下频道

色谱仪光谱仪反应釜试验箱试验机搅拌器培养箱离心机水分测定气体检测量热仪石油仪器纯水器比表面仪温度记录泵流量计万用表显微镜粒度仪测厚仪硬度计酸度计元素分析生物试剂电线电缆天平衡器传感器食品检测压力仪表电化学测厚仪阀门仪表电力仪表干燥设备药物检测