PWM关心的就是两个 一个是周期(自动重载值),还有就是占空比。
需要注意的是如果想要输出高电平不能将占空比设置为等于周期PeriodVal,需要强制输出高电平
同时如果不需要的是需要将强制端口状态取消
动态改占空比
由于我不怎么会用华大的单片机,我在更改了占空比之后发现不能在该第二次
查了资料,论坛,给出的方法是使用缓存
static void Timera_Config(void)
{
/* configuration structure initialization */
MEM_ZERO_STRUCT(stcTimeraInit);
MEM_ZERO_STRUCT(stcIrqRegiConf);
MEM_ZERO_STRUCT(stcTimerCompareInit);
MEM_ZERO_STRUCT(stcTimeraHwConfig);
MEM_ZERO_STRUCT(stcPortInit);
/* Configuration peripheral clock */
PWC_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TIMA4, Enable);
/* Configuration TIMERA compare pin */
PORT_SetFunc(TIMERA_UNIT1_CH4_PORT, TIMERA_UNIT1_CH4_PIN, TIMERA_UNIT1_CH4_FUNC, Disable);
/* Configuration timera unit 1 base structure */
stcTimeraInit.enClkDiv = TimeraPclkDiv128;; //分频
stcTimeraInit.enCntMode = TimeraCountModeTriangularWave; //波形
stcTimeraInit.enCntDir = TimeraCountDirUp;//计数方向
stcTimeraInit.enSyncStartupEn = Disable;//关闭同步
stcTimeraInit.u16PeriodVal = 330u; //freq: 1000Hz //设置周期
TIMERA_BaseInit(M4_TMRA4, &stcTimeraInit); //初始化tima4
/* Configuration timera unit 1 compare structure */
stcTimerCompareInit.u16CompareVal = 0;//占空比
stcTimerCompareInit.enStartCountOutput = TimeraCountStartOutputLow;
stcTimerCompareInit.enStopCountOutput = TimeraCountStopOutputLow;
stcTimerCompareInit.enCompareMatchOutput = TimeraCompareMatchOutputReverse;
stcTimerCompareInit.enPeriodMatchOutput = TimeraPeriodMatchOutputKeep;
stcTimerCompareInit.enSpecifyOutput = TimeraSpecifyOutputInvalid;
stcTimerCompareInit.enCacheEn = Enable;
stcTimerCompareInit.enTriangularTroughTransEn = Enable;
stcTimerCompareInit.enTriangularCrestTransEn = Disable;
stcTimerCompareInit.u16CompareCacheVal = stcTimerCompareInit.u16CompareVal;
TIMERA_CompareInit(M4_TMRA4, TIMERA_UNIT1_CH4, &stcTimerCompareInit);//比较使能
TIMERA_CompareCmd(M4_TMRA4, TIMERA_UNIT1_CH4, Enable);//
TIMERA_Cmd(M4_TMRA4,Enable);
}
void Set_comValue(uint16_t Value)
{
float u16TimerPeriod;
u16TimerPeriod = TIMERA_GetPeriodValue(M4_TMRA4);
if(Value>=255)
{
TIMERA_CompareInit(M4_TMRA4, TIMERA_UNIT1_CH4, &stcTimerCompareInit);//比较使能
TIMERA_CompareCmd(M4_TMRA4, TIMERA_UNIT1_CH4, Enable);//
TIMERA_Cmd(M4_TMRA4,Enable);
TIMERA_SpecifyOutputSta(M4_TMRA4, TimeraCh1,TimeraSpecifyOutputHigh);
}
else if(Value<=0)
{
TIMERA_SpecifyOutputSta(M4_TMRA4,TimeraCh1,TimeraSpecifyOutputInvalid);
TIMERA_Cmd(M4_TMRA4,Disable);
TIMERA_CompareInit(M4_TMRA4, TIMERA_UNIT1_CH4, &stcTimerCompareInit);//比较使能
TIMERA_CompareCmd(M4_TMRA4, TIMERA_UNIT1_CH4, Enable);//
TIMERA_Cmd(M4_TMRA4,Enable);
TIMERA_SetCompareValue(M4_TMRA4, TimeraCh2,0);
TIMERA_SpecifyOutputSta(M4_TMRA4,TimeraCh1,TimeraSpecifyOutputInvalid);
}
else
{
Value = (u16TimerPeriod/255)*(255-Value);
TIMERA_SpecifyOutputSta(M4_TMRA4,TimeraCh1,TimeraSpecifyOutputInvalid);
TIMERA_SetCompareValue(M4_TMRA4, TimeraCh2,Value);
TIMERA_SpecifyOutputSta(M4_TMRA4,TimeraCh1,TimeraSpecifyOutputInvalid);
}
}
最后就是为啥在函数里面又初始化了一遍,enmm..这个是因为我发现如果不这样搞会出现占空比为0,或者最高的时候会被忽略了,或者最高变成了电平