HC32F460如何动态改pwm占空比
static void Timera_Config(void){
stc_timera_base_init_t stcTimeraInit;
stc_timera_compare_init_t stcTimerCompareInit;
stc_irq_regi_conf_t stcIrqRegiConf;
stc_timera_hw_startup_config_t stcTimeraHwConfig;
stc_port_init_t stcPortInit;
/* 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);
PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_AOS, 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 = 87u;//占空比
stcTimerCompareInit.enStartCountOutput = TimeraCountStartOutputLow;
stcTimerCompareInit.enStopCountOutput = TimeraCountStopOutputLow;
stcTimerCompareInit.enCompareMatchOutput = TimeraCompareMatchOutputReverse;
stcTimerCompareInit.enPeriodMatchOutput = TimeraPeriodMatchOutputKeep;
stcTimerCompareInit.enSpecifyOutput = TimeraSpecifyOutputInvalid;
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);
TIMERA_Cmd(M4_TMRA4,Disable);
if(Value>=255)
{
TIMERA_SpecifyOutputSta(M4_TMRA4,TIMERA_UNIT1_CH4,TimeraSpecifyOutputHigh);
TIMERA_CompareCmd(M4_TMRA4, TIMERA_UNIT1_CH4, Enable);//
}
else if(Value<=0)
{
TIMERA_SpecifyOutputSta(M4_TMRA4,TIMERA_UNIT1_CH4,TimeraSpecifyOutputLow);
TIMERA_CompareCmd(M4_TMRA4, TIMERA_UNIT1_CH4, Enable);//
}
else
{
Value = (u16TimerPeriod/255)*Value;
TIMERA_SetCompareValue(M4_TMRA4, TIMERA_UNIT1_CH4,Value);
TIMERA_CompareCmd(M4_TMRA4, TIMERA_UNIT1_CH4, Enable);//
}
TIMERA_Cmd(M4_TMRA4,Enable);
}
void Linear_variation()
{
for(int i=0;i<255;i++)
{
Ddl_Delay1ms(500ul);
Set_comValue(i);
Ddl_Delay1ms(500ul);
}
TIMERA_Cmd(M4_TMRA4,Enable);
}
/**
*******************************************************************************
** \briefmain function for Timera compare function
**
** \param None
**
** \retval int32_t Return value, if needed
**
******************************************************************************/
int32_t main(void)
{
uint16_t u16TimerPeriod = 0u, u16DutyCycle = 0u;
stc_port_init_t stcPortInit;
/* configure structure initialization */
MEM_ZERO_STRUCT(stcPortInit);
/* Configure system clock frequency */
SystemClk_Init();
/* Configure Timera */
Timera_Config();
u16DutyCycle = TIMERA_GetCompareValue(M4_TMRA4, TIMERA_UNIT1_CH4);
u16TimerPeriod = TIMERA_GetPeriodValue(M4_TMRA4);
while (1)
{
Linear_variation();
}
} 好像是重装计数器值 chenjun89 发表于 2023-4-11 20:16
好像是重装计数器值
可是这个操作 万一我一直频繁变换占空比会出现计数值还没到上限就被重装了,从而一直是低电平 LUOKK 发表于 2023-4-12 09:34
可是这个操作 万一我一直频繁变换占空比会出现计数值还没到上限就被重装了,从而一直是低电平 ...
请使用定时器的缓存功能 wubangmi 发表于 2023-4-12 09:37
请使用定时器的缓存功能
感谢提醒,但是再用缓存功能的时候遇到了问题就是,当占空比由别的数值变为0的时候会出现高电平的现象 动态的改变的话是能做到无缝连接的吗 更改配置的话 新配置在什么时候才会生效呢 八层楼 发表于 2023-4-14 14:25
更改配置的话 新配置在什么时候才会生效呢
感觉应该是当前的运行周期结束后生效 LUOKK 发表于 2023-4-12 15:13
感谢提醒,但是再用缓存功能的时候遇到了问题就是,当占空比由别的数值变为0的时候会出现高电平的现象 ...
TimerA有个端口控制寄存器,占空比为0和100%的时候,需要用这个寄存器的一位配置让输出使能无效,然后寄存器的另外两位配置端口强制切换成输出低和输出高。除了0和100%之外的占空比又需要重新配置成输出使能有效。
如果没明白我说的意思,请直接找你对应的代理商朋友 tpgf 发表于 2023-4-14 13:53
动态的改变的话是能做到无缝连接的吗
应该是的 因为改变的时候并不需要停止使用pwm啊 wubangmi 发表于 2023-4-12 09:37
请使用定时器的缓存功能
请问什么是定时器的缓存功能啊 在什么时候有使用的必要呢 heimaojingzhang 发表于 2023-4-15 14:34
请问什么是定时器的缓存功能啊 在什么时候有使用的必要呢
这个说的是不是预装寄存器及影子寄存器呀 要在当前运行周期结束才能更新吧
页:
[1]