OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4288|回复: 3

STM32F103C8T6 超声波HC-SR04输入捕获

[复制链接]

1

主题

7

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2022-6-7
在线时间
1 小时
发表于 2022-6-7 15:10:46 | 显示全部楼层 |阅读模式
1金钱
最近在做小车,使用的是0.96寸的OLED和HC-SR04超声波模块儿,我想使用TIM4的CH3即PB8对超声波的Echo电平进行输入捕获并显示到OLED上,可是程序并不能够显示?如果使用读取GPIO端口电平值是可以工作的,即while等待端口电平跳变。烦请各位帮忙看一下问题所在?OLED显示功能是正常的,使用的软件IIC进行通信。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2022-6-8 10:51:58 | 显示全部楼层
一般用adc去采集好一点为什么用输入捕获呢
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2022-6-7
在线时间
1 小时
 楼主| 发表于 2022-6-8 12:58:45 | 显示全部楼层
本帖最后由 sheriff 于 2022-6-8 12:59 编辑
lpwithv 发表于 2022-6-8 10:51
一般用adc去采集好一点为什么用输入捕获呢

因为这个超声波模块输出的是数字信号,只需要测其高电平持续时间就能够得到发射到接收的总时间(不过为啥我贴的代码图不见了)
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2022-6-7
在线时间
1 小时
 楼主| 发表于 2022-6-8 13:21:35 | 显示全部楼层
整个代码如下(改自正点原子输入捕获教程):
void ultraSonic_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        TIM_ICInitTypeDef TIM4_ICInitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

        // 初始化PB9,用作Trig角
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        // 初始化PB8,用作Echo角
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        // 下拉,保持低电平
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        // 初始化TIM4
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
        TIM_TimeBaseStructure.TIM_Period = 1000;
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
       
        TIM4_ICInitStructure.TIM_Channel = TIM_Channel_3;
        TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // 上升沿捕获
        TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
        TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 配置输入分频,不分频
        TIM4_ICInitStructure.TIM_ICFilter = 0x00;        // 不滤波
        TIM_ICInit(TIM4, &TIM4_ICInitStructure);

        // 初始化NVIC
        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_Init(&NVIC_InitStructure);

        // 初始化关中断
        TIM_ITConfig(TIM4, TIM_IT_Update|TIM_IT_CC3, DISABLE);
        TIM_Cmd(TIM4, ENABLE);
}

u8 TIM4CH3_CAPTURE_STA=0;
u16 TIM4CH3_CAPTURE_VAL;

void TIM4_IRQHandler(void)
{
        if((TIM4CH3_CAPTURE_STA&0X80)==0)// 还未成功捕获
        {
                // 定时中断
                if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
                {
                        // 捕获时长过长处理
                        if(TIM4CH3_CAPTURE_STA&0X40)
                        {
                                if((TIM4CH3_CAPTURE_STA&0Xf)==0Xf)
                                {
                                        TIM4CH3_CAPTURE_STA|=0X80;
                                        TIM4CH3_CAPTURE_VAL=0XFFFF;
                                }
                                else
                                        TIM4CH3_CAPTURE_STA ++;
                        }
                }
                // 捕获中断
                if (TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET)
                {
                        if(TIM4CH3_CAPTURE_STA&0X40) // 第二次捕获到上升沿
                        {
                                TIM4CH3_CAPTURE_STA|=0X80; //标记成功捕获
                                TIM4CH3_CAPTURE_VAL=TIM_GetCapture3(TIM4);
                                TIM_OC3PolarityConfig(TIM4, TIM_ICPolarity_Rising);
                        }
                        else // 第一次捕获到上升沿
                        {
                                TIM4CH3_CAPTURE_STA=0;
                                TIM4CH3_CAPTURE_VAL=0;
                                TIM_SetCounter(TIM4,0);
                                TIM4CH3_CAPTURE_STA|=0X40;        // 标记捕获到上升沿了
                                TIM_OC3PolarityConfig(TIM4, TIM_ICPolarity_Falling);
                        }
                }
         TIM_ClearITPendingBit(TIM4, TIM_IT_CC3|TIM_IT_Update); // 清除中断标志位
        }
}

float getDistance(u8 cc)
{
        float distance;
        u8 count = 0;
        float sum;
        TIM_ITConfig(TIM4, TIM_IT_Update|TIM_IT_CC3, ENABLE);
        GPIO_SetBits(GPIOB, GPIO_Pin_9);
        delay_us(10);
        GPIO_ResetBits(GPIOB, GPIO_Pin_9);
        while (count < cc)
        {
                if (TIM4CH3_CAPTURE_STA&0x80)
                {
                        echoTime = TIM4CH3_CAPTURE_STA&0X3F;
                        echoTime *= 1000;
                        echoTime += TIM4CH3_CAPTURE_VAL;
                        sum += echoTime/58.0;
                        TIM4CH3_CAPTURE_STA = 0;
                        count ++;
                }
        }
        TIM_ITConfig(TIM4, TIM_IT_Update|TIM_IT_CC3, DISABLE);
        distance = sum/cc;
        return distance;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 22:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表