新手入门
- 积分
- 2
- 金钱
- 2
- 注册时间
- 2018-4-13
- 在线时间
- 3 小时
|
5金钱
不知哪位大神知道STM8的TIM1的输入捕获是如何配置的,现在正在研究超声波测距。需要用TIM1的输入捕获去获得声波返回的高电平时间,由于担心用外部中断加定时器的方法带来的误差太大,而且麻烦。于是就想到了使用TIM1_CH1的输入捕获。但是遇到了一系列的问题,查了好多资料,基本还是在原地打转,求助。
我现在的疑问注主要有以下几点:
1、我设置的TIM1输入捕获是采用通道一,上升沿触发,采用滤波后的定时器输入1和复位模式。我现在不清楚,这个到底是当外部的上升沿信号来之后就触发中断,还是上升沿来后只是触发计数器开始计数,等到高电平结束到下降沿才触发中断的?
2、我现在在中断函数里直接就是读取TIM1的捕获1的寄存器值,但是为何每次的数据都是不一样,而且很不稳定。
3、不知原子哥有没有空,帮忙解决下,附上我的TIM1程序和中断处理程序。
void TIM1_InPut_Config(void)
{
TIM1_DeInit();
TIM1_PrescalerConfig(0x063f, TIM1_PSCRELOADMODE_IMMEDIATE); //分频1599+1
TIM1_CCER1 = 0x00; //禁止输入捕获1
TIM1_CCMR1 =0x01; // ch1映射到ti1fp1
TIM1_CCER1 &= 0xfd; //ch1 上升沿触发
TIM1_SMCR =0X54; //选源触发源和触发方式 复位
TIM1_IER |=0x02; //使能中断ch1
TIM1_CCER1 |= 0x01; //使能输入捕获1,2
TIM1_Cmd(ENABLE); //使能定时器1
}
中断处理:
@far @interrupt void TIM1_sever (void)
{
TIM1_Value=0; //清零TIM1_Value变量,该变量用于读取捕获1值,当作中继
if( SET == TIM1_GetITStatus(TIM1_IT_CC1)) //判断捕获1标记位是否为一
{
TIM1_Value= TIM1_GetCapture1(); //读取捕获1值
TIM1_SetCompare1(0x0000); //清空捕获1值的寄存器,貌似没用
TIM1_ClearITPendingBit(TIM1_IT_CC1); //清空捕获1标记位
TIM1_Value/=10000; //读取后的数据除以10000,定时器处分频1600,得到秒的数据
TIM1_Value*=17000;//*34000/2 //乘以声音的速度除以2.。此处单位为厘米
}
TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
//清除中断标记位
}
以上的程序可以进中断,,但是TIM1_Value都出来的数据每次都在变,差异还很大,,求救。。。谢谢。。。。。。。。。。。。。。 |
|