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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
正点原子
1楼-- · 2019-07-20 00:00
 精彩回答 2  元偷偷看……
Mars_wei
2楼-- · 2019-07-20 01:10
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-07-20 06:40
回复【3楼】Mars_wei:
---------------------------------
单纯计数,用定时器外部计数模式就可以了
Mars_wei
4楼-- · 2019-07-20 07:11
回复【4楼】正点原子:
---------------------------------
我主要是要采集过来脉冲的 周期和占空比,不知道这样的方式做可行?如果不可以的话,那上面那样的PWM捕获的方法有哪里可以改善呢?
正点原子
5楼-- · 2019-07-20 09:42
 精彩回答 2  元偷偷看……
Mars_wei
6楼-- · 2019-07-20 14:15
 精彩回答 2  元偷偷看……

一周热门 更多>