久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1855|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

stm32驅(qū)動(dòng)多個(gè)超聲波程序 無法正常運(yùn)行

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:927434 發(fā)表于 2021-12-23 16:25 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
今天做作品 單個(gè)的超聲波模塊解決了 但是當(dāng)多個(gè) 修改代碼后 編譯沒有問題 缺無法正常運(yùn)行 不知道問題出在哪里 有大佬解答下嗎?
可運(yùn)行的csb0.c
#include "csb0.h"
#include "stm32f10x.h"
#include "delay.h"

/*記錄定時(shí)器溢出次數(shù)*/
unsigned int overcount1 = 0;


/**
* Function       bsp_getUltrasonicDistance
* @brief         獲取超聲距離
* @param[in]     void
* @param[out]    void
* @return        距離浮點(diǎn)值
* @par History   無
*/

void Ultrasonic_GPIO_Init(void)
{

        /*定義一個(gè)GPIO_InitTypeDef類型的結(jié)構(gòu)體*/
        GPIO_InitTypeDef GPIO_InitStructure;
        /*開啟外設(shè)時(shí)鐘*/
        RCC_APB2PeriphClockCmd(TRIG_RCC0, ENABLE);
        //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  //禁能jtag
        /*TRIG觸發(fā)信號(hào)*/                                                                                                                  
          GPIO_InitStructure.GPIO_Pin = TRIG_PIN0;        
        /*設(shè)置引腳模式為通用推挽輸出*/
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
        /*設(shè)置引腳速率為50MHz */   
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        /*調(diào)用庫函數(shù),初始化*/
          GPIO_Init(TRIG_PORT0, &GPIO_InitStructure);                 

        /*開啟外設(shè)時(shí)鐘*/
          RCC_APB2PeriphClockCmd(ECHO_RCC0, ENABLE);
        /*ECOH回響信號(hào)*/                                                                                                                           
          GPIO_InitStructure.GPIO_Pin = ECHO_PIN0;        
        /*設(shè)置引腳模式為通用推挽輸出*/
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
        /*調(diào)用庫函數(shù),初始化PORT*/
          GPIO_Init(ECHO_PORT0, &GPIO_InitStructure);               
}

/**
* Function       bsp_Ultrasonic_Timer2_Init
* @brief         初始化定時(shí)器TIM2
* @param[in]     void
* @param[out]    void
* @return        距離浮點(diǎn)值
* @par History   無
*/

void bsp_Ultrasonic_Timer2_Init(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;
        NVIC_InitTypeDef NVIC_InitStructer;


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        
        /*定時(shí)器TIM2初始化*/
        TIM_DeInit(TIM2);
        TIM_TimeBaseInitStructer.TIM_Period = 999;//定時(shí)周期為1000
        TIM_TimeBaseInitStructer.TIM_Prescaler = 71; //分頻系數(shù)72
        TIM_TimeBaseInitStructer.TIM_ClockDivision = TIM_CKD_DIV1;//不分頻
        TIM_TimeBaseInitStructer.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);
        
        TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//開啟更新中斷
        
        NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructer.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructer.NVIC_IRQChannel = TIM2_IRQn;
        NVIC_InitStructer.NVIC_IRQChannelCmd = ENABLE;
        
        NVIC_Init(&NVIC_InitStructer);
        TIM_Cmd(TIM2, DISABLE);//關(guān)閉定時(shí)器使能 使接收到信號(hào)后再計(jì)時(shí)

}

void TIM2_IRQHandler(void) //中斷,當(dāng)回響信號(hào)很長是,計(jì)數(shù)值溢出后重復(fù)計(jì)數(shù),用中斷來保存溢出次數(shù)
{
        if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除中斷標(biāo)志
                overcount1++;        //統(tǒng)計(jì)計(jì)數(shù)器的計(jì)時(shí)周期
        }
}



float bsp_getUltrasonicDistance(void)
{
        float length1 = 0, sum1 = 0;
        u16 tim;
        unsigned int  i = 0;

        /*測(cè)5次數(shù)據(jù)計(jì)算一次平均值*/
        while(i != 5)
        {
                GPIO_SetBits(TRIG_PORT0, TRIG_PIN0);  //拉高信號(hào),作為觸發(fā)信號(hào)
                delay_us(20);                                                  //高電平信號(hào)超過10us
                GPIO_ResetBits(TRIG_PORT0, TRIG_PIN0);
                /*等待回響信號(hào)*/
                while(GPIO_ReadInputDataBit(ECHO_PORT0, ECHO_PIN0) == 0);
                TIM_Cmd(TIM2,ENABLE);//回響信號(hào)到來,開啟定時(shí)器計(jì)數(shù)               
                i+=1; //每收到一次回響信號(hào)+1,收到5次就計(jì)算均值
                while(GPIO_ReadInputDataBit(ECHO_PORT0, ECHO_PIN0) == 1);//回響信號(hào)消失
                TIM_Cmd(TIM2, DISABLE);//關(guān)閉定時(shí)器               
                tim = TIM_GetCounter(TIM2);//獲取計(jì)TIM2數(shù)寄存器中的計(jì)數(shù)值,一邊計(jì)算回響信號(hào)時(shí)間               
                length1 = (tim + overcount1 * 1000) / 58.0;//通過回響信號(hào)計(jì)算距離               
                sum1 = length1 + sum1;
                TIM2->CNT = 0;  //將TIM2計(jì)數(shù)寄存器的計(jì)數(shù)值清零
                overcount1 = 0;  //中斷溢出次數(shù)清零
                delay_ms(1);
        }
        length1 = sum1 / 5;
        return length1;                //距離作為函數(shù)返回值
}
csb0.h

#define  __BSP_ULTRASONIC_H__
#define  __BSP_ULTRASONIC_H__

#define TRIG_RCC0  RCC_APB2Periph_GPIOB
#define ECHO_RCC0  RCC_APB2Periph_GPIOB
#define TRIG_PIN0  GPIO_Pin_6
#define ECHO_PIN0  GPIO_Pin_7
#define TRIG_PORT0  GPIOB
#define ECHO_PORT0  GPIOB


//#define HC_GPIO_PIN GPIO_Pin_7
//#define HC_PORT GPIOB


void Ultrasonic_GPIO_Init(void);

extern float bsp_getUltrasonicDistance(void);
extern void bsp_Ultrasonic_Timer2_Init(void);

修改后 無法使用的 (定時(shí)器 打算使用3)
csb1.c
#include "csb1.h"
#include "stm32f10x.h"
#include "delay.h"

/*記錄定時(shí)器溢出次數(shù)*/
unsigned int overcount2 = 0;


/**
* Function       bsp_getUltrasonicDistance
* @brief         獲取超聲距離
* @param[in]     void
* @param[out]    void
* @return        距離浮點(diǎn)值
* @par History   無
*/

void Ultrasonic_GPIO_Init2(void)
{

        /*定義一個(gè)GPIO_InitTypeDef類型的結(jié)構(gòu)體*/
        GPIO_InitTypeDef GPIO_InitStructure;
        /*開啟外設(shè)時(shí)鐘*/
        RCC_APB2PeriphClockCmd(TRIG_RCC1, ENABLE);
        //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  //禁能jtag
        /*TRIG觸發(fā)信號(hào)*/                                                                                                                  
          GPIO_InitStructure.GPIO_Pin = TRIG_PIN1;        
        /*設(shè)置引腳模式為通用推挽輸出*/
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
        /*設(shè)置引腳速率為50MHz */   
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        /*調(diào)用庫函數(shù),初始化*/
          GPIO_Init(TRIG_PORT1, &GPIO_InitStructure);                 

        /*開啟外設(shè)時(shí)鐘*/
          RCC_APB2PeriphClockCmd(ECHO_RCC1, ENABLE);
        /*ECOH回響信號(hào)*/                                                                                                                           
          GPIO_InitStructure.GPIO_Pin = ECHO_PIN1;        
        /*設(shè)置引腳模式為通用推挽輸出*/
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
        /*調(diào)用庫函數(shù),初始化PORT*/
          GPIO_Init(ECHO_PORT1, &GPIO_InitStructure);               
}

/**
* Function       bsp_Ultrasonic_Timer3_Init
* @brief         初始化定時(shí)器TIM3
* @param[in]     void
* @param[out]    void
* @return        距離浮點(diǎn)值
* @par History   無
*/

void bsp_Ultrasonic_Timer3_Init(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;
        NVIC_InitTypeDef NVIC_InitStructer;


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        
        /*定時(shí)器TIM3初始化*/
        TIM_DeInit(TIM3);
        TIM_TimeBaseInitStructer.TIM_Period = 999;//定時(shí)周期為1000
        TIM_TimeBaseInitStructer.TIM_Prescaler = 71; //分頻系數(shù)72
        TIM_TimeBaseInitStructer.TIM_ClockDivision = TIM_CKD_DIV1;//不分頻
        TIM_TimeBaseInitStructer.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructer);
        
        TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//開啟更新中斷
        
        NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructer.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructer.NVIC_IRQChannel = TIM3_IRQn;
        NVIC_InitStructer.NVIC_IRQChannelCmd = ENABLE;
        
        NVIC_Init(&NVIC_InitStructer);
        TIM_Cmd(TIM3, DISABLE);//關(guān)閉定時(shí)器使能 使接收到信號(hào)后再計(jì)時(shí)

}

void TIM3_IRQHandler(void) //中斷,當(dāng)回響信號(hào)很長是,計(jì)數(shù)值溢出后重復(fù)計(jì)數(shù),用中斷來保存溢出次數(shù)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//清除中斷標(biāo)志
                overcount2++;        //統(tǒng)計(jì)計(jì)數(shù)器的計(jì)時(shí)周期
        }
}



float bsp_getUltrasonicDistance2(void)
{
        float length2 = 0, sum2 = 0;
        u16 tim;
        unsigned int  x = 0;

        /*測(cè)5次數(shù)據(jù)計(jì)算一次平均值*/
        while(x != 5)
        {
                GPIO_SetBits(TRIG_PORT1, TRIG_PIN1);  //拉高信號(hào),作為觸發(fā)信號(hào)
                delay_us(20);                                                  //高電平信號(hào)超過10us
                GPIO_ResetBits(TRIG_PORT1, TRIG_PIN1);
                /*等待回響信號(hào)*/
                while(GPIO_ReadInputDataBit(ECHO_PORT1, ECHO_PIN1) == 0);
                TIM_Cmd(TIM3,ENABLE);//回響信號(hào)到來,開啟定時(shí)器計(jì)數(shù)               
                x+=1; //每收到一次回響信號(hào)+1,收到5次就計(jì)算均值
                while(GPIO_ReadInputDataBit(ECHO_PORT1, ECHO_PIN1) == 1);//回響信號(hào)消失
                TIM_Cmd(TIM3, DISABLE);//關(guān)閉定時(shí)器               
                tim = TIM_GetCounter(TIM3);//獲取計(jì)TIM3數(shù)寄存器中的計(jì)數(shù)值,一邊計(jì)算回響信號(hào)時(shí)間               
                length2 = (tim + overcount2 * 1000) / 58.0;//通過回響信號(hào)計(jì)算距離               
                sum2 = length2 + sum2;
                TIM3->CNT = 0;  //將TIM3計(jì)數(shù)寄存器的計(jì)數(shù)值清零
                overcount2 = 0;  //中斷溢出次數(shù)清零
                delay_ms(1);
        }
        length2 = sum2 / 5;
        return length2;                //距離作為函數(shù)返回值
}
csb.h


#ifndef __BSP_ULTRASONIC_H__
#define __BSP_ULTRASONIC_H__        
#define TRIG_RCC1                RCC_APB2Periph_GPIOB
#define ECHO_RCC1                RCC_APB2Periph_GPIOB
#define TRIG_PIN1                GPIO_Pin_6
#define ECHO_PIN1                GPIO_Pin_7
#define TRIG_PORT1                GPIOB
#define ECHO_PORT1                GPIOB
void Ultrasonic_GPIO_Init(void);

extern float bsp_getUltrasonicDistance2(void);
extern void bsp_Ultrasonic_Timer3_Init(void);



#endif

當(dāng)時(shí)為了分開調(diào)試 所以將端口定義的一樣 求大佬 可以幫忙看出程序的錯(cuò)誤
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:488334 發(fā)表于 2021-12-25 19:50 | 只看該作者
有沒有考慮過循環(huán)開啟超聲波時(shí),關(guān)閉其他的定時(shí)器?一個(gè)超聲波對(duì)應(yīng)一個(gè)定時(shí)器,當(dāng)前超聲波開啟時(shí),關(guān)閉其他定時(shí)器,只用當(dāng)前超聲波對(duì)應(yīng)的定時(shí)器

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品乱码久久久久v最新版 | 中文字字幕一区二区三区四区五区 | 国产一区二区在线免费观看 | 国产精品精品久久久久久 | 国产一区二区三区久久久久久久久 | 国产a区| 日韩在线一区二区三区 | 91网在线观看 | 久久99这里只有精品 | 欧美一区二区另类 | xxxxxx国产| 欧美视频二区 | 国产一区 | 国产精品99久久久久久www | 91精品国产综合久久久密闭 | 99re| 国产在线一区二区三区 | 欧美一级毛片久久99精品蜜桃 | 伊人久久精品一区二区三区 | 自拍偷拍精品 | 中文字幕一区二区三区四区五区 | 亚洲一区二区中文字幕 | 国产欧美在线一区 | 久久精品国产久精国产 | 久久国产精品-国产精品 | 亚洲成人av一区二区 | 91久久久精品国产一区二区蜜臀 | 天天躁日日躁狠狠很躁 | 精品国产一区二区在线 | 粉嫩av久久一区二区三区 | 麻豆va | 在线看亚洲 | 精品一区二区三区电影 | 欧美一级免费看 | 黑人巨大精品 | 国产男女视频 | 国产欧美精品一区 | 久久久www成人免费精品 | 精品国产不卡一区二区三区 | 日本不卡一区二区三区 | 欧美一级欧美三级在线观看 |