本帖最后由 rookie108 于 2019-12-8 23:50 编辑
我在用STM8S208的TIM1接JSN-SR04T超声波测距模块做测距时,发现TIM1_CCR2中的值与实际距离成反比,即距离越近,CCR2中的值越大。实际情况应该是成正比的。使用逻辑分析仪检测发现输入的脉冲宽度是和时间成正比的。在此请教各位高手,程序在哪里出错了。谢谢
代码如下:
/*硬件接线说明
PC1接ECHO
PI0接TRIG
*/
#include "iostm8s208mb.h"//主控芯片的头文件
#include "ptctr.h"
#include "lcd1602.h"
#include "stdbool.h"
#include "stdio.h"
#define TRIG PI_ODR_ODR0 //输出给超声波一个触发信号的引脚
u16 pw1=0,pw2=0;
u16 tmp=0;
_Bool pw_Flag=false;
int main(void)
{
Clock_Config();
Delay_ms(10);//延时等待稳定
GPIO_Config();//初始化相关GPIO引脚配置
TIM1_init();//TIM1相关功能配置初始化
asm("rim");
while(1)
{
TRIG =1;//保证最短10us的高电平
Delay_us(15);
TRIG =0;
Delay_ms(100);//保持100ms的延时以等待回波
if(pw_Flag==true)
{
tmp=(float)pw2*0.017;//0.017是声速340m/s除以2的值。
pw_Flag=false;
}
}
}
/*TIM1捕获/比较中断*/
#pragma vector=TIM1_CAPCOM_CC1IF_vector
__interrupt void TIM1_CAPCOM_CC1IF_ISR(void)
{
if(TIM1_SR1_CC1IF==1)
{
TIM1_SR1_CC1IF=0;//清除中断标志位
}
if(TIM1_SR1_CC2IF==1)
{
TIM1_SR1_CC2IF=0;//清除中断标志位
pw2=TIM1_CCR2H;
pw2<<=8;
pw2+=TIM1_CCR2L;
pw_Flag=true;
}
}
/*TIM1初始配置*/
void TIM1_init(void){
CLK_PCKENR1=0x80;//打开定时器1时钟
TIM1_PSCRH=0;//16M不分频
TIM1_PSCRL=0;
TIM1_CR1_ARPE =0;//不通过预装载寄存器
TIM1_CR1_URS=1;//仅当计数器溢出时才发生中断请求
TIM1_CR1_UDIS=1;//禁止更新事件//计数器溢出属于更新事件
TIM1_CR1_DIR=0;//向上计数
TIM1_CCMR1=0;
TIM1_CCMR1 |=0x01;
TIM1_CCMR2=0;
TIM1_CCMR2|=0x02;
TIM1_CCER1_CC1P=0;//上升沿时发生捕获
TIM1_CCER1_CC2P=1;//下降沿时发生捕获
TIM1_CCER1_CC1E=1;//使能捕获功能
TIM1_CCER1_CC2E=1;//使能捕获功能
TIM1_SMCR=0x54;//
TIM1_CCER1_CC1E=1;//使能捕获功能
TIM1_CCER1_CC2E=1;//使能捕获功能
TIM1_IER_CC1IE=1;//开启捕获中断
TIM1_IER_CC2IE=1;//开启捕获中断
TIM1_CR1_CEN=1;//开启计数
}
/*时钟初始配置*/
void Clock_Config(void){
//==启用外部晶振.不分频。
CLK_CKDIVR =0x02;//四分频
CLK_ECKR=0x01;//HSE开
CLK_ICKR=0x00;
while(CLK_ECKR!=0x03);//等待HSE准备就绪
CLK_SWR=0xb4;//设置HSE为主时钟源
CLK_SWCR=0x03;//使能时钟切换,禁止时钟中断
while(!(CLK_SWCR &0x08)); // 等待切换至HSE完成
}
/*GPIO初始配置*/
void GPIO_Config(void){
PI_DDR_DDR0=1; //配置PI0端口为输出模式
PI_CR1_C10=1; //配置PI0端口为推挽输出模式
PI_CR2_C20=1; //配置PI0端口高速输出
PI_ODR_ODR0=0; //输出低电平
PC_DDR_DDR1 =0;//PC1输入
PC_CR1_C11 =0;//浮空输入
PC_CR2_C21 =0;//禁止外部中断功能
}
|