STM8S207 TIM1_PWM捕获,周期和低电平时间都不准,差2个us,求指导。

2019-07-19 21:55发布

用STM8S207 TIM1做PWM捕获实验,用的是内部时钟16经过8分频之后TIM1时钟为2M。

TIM2生产了38K,占空比为50%的PWM,TIM1捕获,利用STM32捕获的话周期为26us,低电平时间为13us,

利用STM8则周期为24us,低电平时间为12us,STM32捕获的也是STM8 TIM2产生的PWM。

下面是我的代码,求大神指教。
[mw_shl_code=c,true]void TIM1CH1_PWMIN(void) { TIM1_DeInit(); // 8分频,TIM1时钟为2M TIM1_TimeBaseInit(8, TIM1_COUNTERMODE_UP, 0xffff, 0); // CC1通道被配置为输入,IC1映射在TI1FP1上; TIM1->CCMR1 |= 0x01; // 使能输入捕获,TI1FP1下降沿触发 TIM1->CCER1 |= 0x03; // CC2通道被配置为输入,IC2映射在TI1FP2上; TIM1->CCMR2 |= 0x02; // 使能输入捕获,TI1FP2上升沿触发 TIM1->CCER1 |= 0x10; // 选择有效的触发输入信号:选源触发源 ti1fp1 触发方式:复位模式 TIM1->SMCR |= 0x54; // 使能中断ch1 ch2 TIM1->IER |= 0x06; TIM1_Cmd(ENABLE); } 中断函数: @far @interrupt void TIM1_CAP_COM_IRQHandler(void) { //TxData('#'); if( SET == TIM1_GetITStatus(TIM1_IT_CC1)) { TIM1_ClearITPendingBit(TIM1_IT_CC1); // 读取周期 IC1Value = TIM1_GetCapture1(); // 得到低电平时间 IC2Value = TIM1_GetCapture2(); if ((IC1Value != 0) && (IC2Value != 0)) { // 得到周期 freqduty_data[g_byFreqdutyCount][0] = IC1Value; // 得到低电平时间 freqduty_data[g_byFreqdutyCount][1] = IC2Value; g_byFreqdutyCount++; } else { // 无效数据 } if (10 == g_byFreqdutyCount) { DISABLE_38K; g_Flag = 1; } } [/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。