初级会员

- 积分
- 73
- 金钱
- 73
- 注册时间
- 2018-3-11
- 在线时间
- 11 小时
|
5金钱
我用的开发板是mini板,学了原子哥的输入捕获实验后,就自己想做个东西玩玩,看着非常简单的东西,确不知道错误出在哪里?这是非常痛苦的,希望懂的大神指点一下哪里出错了
本人思路:超声波传感器就是你给他发送一个10us以上的高电平,便能激活超声波,然后他会将距离的值反应在高电平的持续时间输出,那么我就用输入捕获来测高电平的时间,然后根据时间与距离的关系来算得距离值。
出现的问题:距离测量相当不准确,不管传感器放在什么位置,它的距离值都是递增的
这是我写的输入捕获程序:
#include "csb.h"
#define TRIG PBout(1) //ê1óà B1×÷Îa3¬éù2¨′«¸DÆ÷μÄ′¥·¢êäèë¶Ë
#define ECHO PAin(0) //ê1óà A0×÷Îa»ØÏìDÅoÅμÄêäèë¶ËECHO
void csb_init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitT;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitT;
TIM_ICInitTypeDef TIM_ICInitT;
NVIC_InitTypeDef NVIC_InitT;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA,ENABLE);//ê1ÄüGBIOBμÄê±Öó
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);//ê1Äü¶¨ê±Æ÷μÄê±Öó
/*
PB1×÷Îa3¬éù2¨′«¸DÆ÷μÄ′¥·¢êä3ö¶ËTRIG
*/
GPIO_InitT.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_InitT.GPIO_Pin =GPIO_Pin_1;
GPIO_InitT.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitT);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);//ÖÃ0
/*
PA0×÷Îa»ØÏìμçÆ½μÄêäèë¶ËECHO
*/
GPIO_InitT.GPIO_Mode =GPIO_Mode_IPD;
GPIO_InitT.GPIO_Pin =GPIO_Pin_1;
GPIO_Init(GPIOA,&GPIO_InitT);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);//ÖÃ0
/*
ÅäÖö¨ê±Æ÷TIM5
*/
TIM_TimeBaseInitT.TIM_ClockDivision =TIM_CKD_DIV1;
TIM_TimeBaseInitT.TIM_CounterMode =TIM_CounterMode_Up;
TIM_TimeBaseInitT.TIM_Period =arr;
TIM_TimeBaseInitT.TIM_Prescaler =psc;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitT);
/*
ÅäÖÃêäèë2¶»ñí¨μà
*/
TIM_ICInitT.TIM_Channel =TIM_Channel_2;
TIM_ICInitT.TIM_ICFilter =0X00;
TIM_ICInitT.TIM_ICPolarity =TIM_ICPolarity_Rising;
TIM_ICInitT.TIM_ICPrescaler =TIM_ICPSC_DIV1;
TIM_ICInitT.TIM_ICSelection =TIM_ICSelection_DirectTI;
TIM_ICInit(TIM5,&TIM_ICInitT);
/*
ÅäÖÃÖD¶ÏóÅÏè¼¶oí′ò¿aÖD¶Ï
ê1Äü¶¨ê±Æ÷
*/
NVIC_InitT.NVIC_IRQChannel =TIM5_IRQn;//éèÖÃÄĸöÖD¶Ï
NVIC_InitT.NVIC_IRQChannelCmd =ENABLE;//í¨μàê1Äü′ò¿a
NVIC_InitT.NVIC_IRQChannelPreemptionPriority =2;
NVIC_InitT.NVIC_IRQChannelSubPriority =0;
NVIC_Init(&NVIC_InitT);//5.ÖD¶ÏóÅÏè¼¶éèÖÃ
TIM_ITConfig(TIM5,TIM_IT_Update | TIM_IT_CC2 ,ENABLE);//6.′ò¿a¸üDÂÖD¶Ïoí2¶»ñÖD¶Ï
TIM_Cmd(TIM5,ENABLE);//7.′ò¿a¶¨ê±Æ÷
}
/*
ÖD¶Ï·tÎñoˉêy
*/
//TIM_CH1_SR¼ùÏóËüÎaò»¸ö¼Ä′æÆ÷
//0-5 ¶¨ê±Æ÷μÄòç3ö′Îêy
//6 2¶»ñμ½¸ßμçÆ½±ê־λ
//7 2¶»ñíê3é±ê־λ
u8 TIM_CH2_SR=0;
u16 TIM_VAL;
u16 TIM5_IRQHandler()
{
if((TIM_CH2_SR & 0x80)==0)
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)
{
if(TIM_CH2_SR & 0x40)
{
if((TIM_VAL & 0x3f)==0x3f)
{
TIM_CH2_SR |=0x80;
TIM_VAL=0xffff;
}
else
{
TIM_CH2_SR++;
}
}
}
if(TIM_GetITStatus(TIM5,TIM_IT_CC2)!=RESET)
{
if(TIM_CH2_SR & 0x40)
{
TIM_CH2_SR|=0x80;
TIM_VAL=TIM_GetCapture2(TIM5);
TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Rising);
}
else
{
TIM_CH2_SR=0;
TIM_VAL=0;
TIM_CH2_SR|=0x40;
TIM_SetCounter(TIM5,0);
TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Falling);
}
}
}
TIM_ClearITPendingBit(TIM5,TIM_IT_Update | TIM_IT_CC2);
}
这是主程序:
#include "csb.h"
#include "delay.h"
#include "lcd.h"
#include "usart.h"
extern u8 TIM_CH2_SR;
extern u16 TIM_VAL;
int main(void)
{
u16 time;
u8 i=0;
float sum=0;
float juli=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();
uart_init(9600);
csb_init(65535,71);
while(1)
{
for(i=0;i<5;i++)
{
PBout(1)=1;
delay_us(20);
PBout(1)=0;
delay_ms(60);
// while(PAin(0)==0);
time=TIM_CH2_SR &0x3f;
time=time*65535+TIM_VAL;
juli=((float)time/58.0);
sum=sum+juli;
}
juli=sum/5.0;
printf("距离:%f cm\r\n",juli);
}
}
本来是在定时器5上的通道1上,出现问题,后来改到定时器5上的通道2上,还是出现问题,希望会的大神指导一下。
|
|