最近在搞一个rct6超声波测距有关的项目 结果调了一天 测出来的距离一直都是0 一开始是用外部中断 后来改成了输入捕获 结果还是输出0
这是定时器输入捕获的代码
void TIM3IC_Init()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_InternalClockConfig(TIM3);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 65535 - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1 ;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICFilter = 0xF;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_PWMIConfig(TIM3,&TIM_ICInitStructure);
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
TIM_ITConfig(TIM3,TIM_IT_CC2|TIM_IT_CC1,ENABLE);
TIM_SetCounter(TIM2,0);
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3,ENABLE);
}
void TIM3_IRQHandler()
{
if(TIM_GetITStatus(TIM3,TIM_IT_CC2)!=RESET)
{
Distance = (TIM_GetCapture2(TIM3)+1) * 340/20000.0;
Flag = 1;
//printf("Distance = %f m\r\n",Distance);
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
}
这是配置超声波引脚的代码
float Distance;
int Flag = 1,ICAP1value,ICAP2value;
void HC_SR04_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void HC_SR04_start(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_4);
Delay_us(20);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
Delay_ms(60);
}
输出结果一直为0 串口方面测试过是没问题的 引脚也可以正常输出 但不知道自己的逻辑错在哪了 希望带佬们指导一下
我的代码经测试没有问题,可以借鉴:
#include "stm32f10x.h" //在该头文件中默认定义系统时钟为72M
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "ultrasonic.h"
int main(void)
{
RCC_Configuration();
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart1_init(9600); //串口初始化为9600
Ultrasonic_GPIO_Conf();
EXTI_Configuration();
Timer_Configuration();
init_Ultrasonic();
while(1)
{
// USART1_SendData('*');
// USART1_SendData('\r');
// USART1_SendData('\n');
// Showstring("Distance:");
// delay_ms(800);
// GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)0);
}
}
ultrasonic.c
#include "stm32f10x.h" //在该头文件中默认定义系统时钟为72M
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "ultrasonic.h"
unsigned char SFlag=0;
unsigned long Distance=0;
void Ultrasonic_GPIO_Conf(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//必须先开启复用时钟,然后才能重映射或者外中断
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); // 改变指定管脚的映射 GPIO_Remap_SWJ_JTAGDisable ,JTAG-DP 禁用 + SW-DP 使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //发射引脚初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure); //接收引脚初始化
}
void Timer_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_DeInit(TIM1);
TIM_TimeBaseStructure.TIM_Period=20000; //ARR的值, 一次计时200ms 最大值为34米
TIM_TimeBaseStructure.TIM_Prescaler=719; //719+1=720
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM1->DIER|=1<<0; //允许更新中断
TIM1->DIER|=1<<6; //允许触发中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStructure);
}
//定时器溢出中断服务程序
void TIM1_UP_IRQHandler(void)
{
//USART1_SendData('1');
if(TIM1->SR&0X0001)//溢出中断
{
Showstring("Out of distance! ");
GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)1);//高电平触发
delay_us(20);//如果不加延时,系统不稳定
GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)0);
TIM_SetCounter(TIM1,0);
TIM_Cmd(TIM1, ENABLE);
SFlag=0; //取消当前上升沿标志
}
TIM1->SR&=~(1<<0);//清除中断标志位
}
unsigned long d=3400;
unsigned char i=0;
void EXTI15_10_IRQHandler(void) //当前是设置的电平变化就进入中断
{
// USART1_SendData('Q');
if(EXTI_GetITStatus(EXTI_Line12) != RESET)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)==1) //接收到上升沿,开始计时
{
TIM_SetCounter(TIM1,0);
TIM_Cmd(TIM1, ENABLE);
SFlag=1; //表示经过了上升沿
}
else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)==0 && SFlag==1)
{
TIM_Cmd(TIM1, DISABLE);
Distance=(int)(((float)TIM_GetCounter(TIM1))*1.7); //如果测距是2.5m则需15ms
if(d>Distance) //只要最小值
d=Distance;
i++;
if(i==3) //测量三次,只要最小值
{
i=0;
Showstring("Distance:");
Show_u16(d);
Showstring("mm ");
USART1_SendData('\r');
USART1_SendData('\n');
delay_ms(300);
d=34000;
}
GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)1);//高电平触发
delay_us(20);//如果不加延时,系统不稳定
GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)0);
TIM_SetCounter(TIM1,0);
TIM_Cmd(TIM1, ENABLE);
SFlag=0;
}
EXTI_ClearITPendingBit(EXTI_Line12);
}
}
void init_Ultrasonic(void)
{
delay_ms(100); //为超声波稳定争取时间
GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)0);//先设置成低电平
delay_ms(100);//
GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)1); //高电平触发
delay_us(40);//高电平至少10us
GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)0);//降回低电平
TIM_SetCounter(TIM1,0);
TIM_Cmd(TIM1, ENABLE);
}
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable GPIOB clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* Enable AFIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
/* Configure PB.09 pin as input floating */
/* Connect EXTI9 Line to PB.09 pin */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource12);
/* Configure EXTI9 line */
EXTI_InitStructure.EXTI_Line = EXTI_Line12;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Rising_Falling ;//EXTI_Trigger_Falling EXTI_Trigger_Rising_Falling
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable and set EXTI9_5 Interrupt to the lowest priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//最高优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
我一般遇到这种情况,都是看传感器有没有在main.c中初始化。
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!