用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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
单纯计数,用定时器外部计数模式就可以了
---------------------------------
我主要是要采集过来脉冲的 周期和占空比,不知道这样的方式做可行?如果不可以的话,那上面那样的PWM捕获的方法有哪里可以改善呢?
一周热门 更多>