HC32f460 如何动态改pwm的占空比

 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,或者最高的时候会被忽略了,或者最高变成了电平

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值