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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1868|回復: 1
打印 上一主題 下一主題
收起左側

stm32驅動多個超聲波程序 無法正常運行

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

/*記錄定時器溢出次數*/
unsigned int overcount1 = 0;


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

void Ultrasonic_GPIO_Init(void)
{

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

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

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

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


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        
        /*定時器TIM2初始化*/
        TIM_DeInit(TIM2);
        TIM_TimeBaseInitStructer.TIM_Period = 999;//定時周期為1000
        TIM_TimeBaseInitStructer.TIM_Prescaler = 71; //分頻系數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);//關閉定時器使能 使接收到信號后再計時

}

void TIM2_IRQHandler(void) //中斷,當回響信號很長是,計數值溢出后重復計數,用中斷來保存溢出次數
{
        if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除中斷標志
                overcount1++;        //統計計數器的計時周期
        }
}



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

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

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

/*記錄定時器溢出次數*/
unsigned int overcount2 = 0;


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

void Ultrasonic_GPIO_Init2(void)
{

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

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

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

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


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        
        /*定時器TIM3初始化*/
        TIM_DeInit(TIM3);
        TIM_TimeBaseInitStructer.TIM_Period = 999;//定時周期為1000
        TIM_TimeBaseInitStructer.TIM_Prescaler = 71; //分頻系數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);//關閉定時器使能 使接收到信號后再計時

}

void TIM3_IRQHandler(void) //中斷,當回響信號很長是,計數值溢出后重復計數,用中斷來保存溢出次數
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//清除中斷標志
                overcount2++;        //統計計數器的計時周期
        }
}



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

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

當時為了分開調試 所以將端口定義的一樣 求大佬 可以幫忙看出程序的錯誤
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:488334 發表于 2021-12-25 19:50 | 只看該作者
有沒有考慮過循環開啟超聲波時,關閉其他的定時器?一個超聲波對應一個定時器,當前超聲波開啟時,關閉其他定時器,只用當前超聲波對應的定時器

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲第一天堂 | www.国产精品 | 久久高清精品 | 久久综合av | 免费看a | 欧美日韩激情 | 国产精品一区二区精品 | 91综合在线视频 | 狠狠的干| 欧美精品免费观看二区 | 国产成人精品免高潮在线观看 | 青青草在线视频免费观看 | 亚洲国产一| 国产精品影视在线观看 | www国产亚洲精品久久网站 | 夜夜草视频 | 国产精品日韩在线 | 日韩资源 | 能看的av | 国产精品99久久久久久大便 | 亚洲视频中文字幕 | 国产高清在线精品一区二区三区 | 成人免费观看男女羞羞视频 | 亚洲综合天堂网 | 国产精品美女久久久久久免费 | 亚洲国产成人精品久久 | 国产成人精品a视频 | 欧美精品在线观看 | 亚洲人成人一区二区在线观看 | 国产伦精品一区二区三区精品视频 | www.伊人.com | 奇米影视77 | 日韩视频在线观看 | 成人免费大片黄在线播放 | 懂色av色香蕉一区二区蜜桃 | 国产日韩精品视频 | 久久激情五月丁香伊人 | 一二三在线视频 | 国产一区中文 | 亚洲精品在线视频 | 日韩一级一区 |