欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2197|回復(fù): 1
收起左側(cè)

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

[復(fù)制鏈接]
ID:927434 發(fā)表于 2021-12-23 16:25 | 顯示全部樓層 |閱讀模式
今天做作品 單個的超聲波模塊解決了 但是當多個 修改代碼后 編譯沒有問題 缺無法正常運行 不知道問題出在哪里 有大佬解答下嗎?
可運行的csb0.c
#include "csb0.h"
#include "stm32f10x.h"
#include "delay.h"

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


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

void Ultrasonic_GPIO_Init(void)
{

        /*定義一個GPIO_InitTypeDef類型的結(jié)構(gòu)體*/
        GPIO_InitTypeDef GPIO_InitStructure;
        /*開啟外設(shè)時鐘*/
        RCC_APB2PeriphClockCmd(TRIG_RCC0, ENABLE);
        //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  //禁能jtag
        /*TRIG觸發(fā)信號*/                                                                                                                  
          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è)時鐘*/
          RCC_APB2PeriphClockCmd(ECHO_RCC0, ENABLE);
        /*ECOH回響信號*/                                                                                                                           
          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         初始化定時器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; //分頻系數(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)閉定時器使能 使接收到信號后再計時

}

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



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

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

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

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


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

void Ultrasonic_GPIO_Init2(void)
{

        /*定義一個GPIO_InitTypeDef類型的結(jié)構(gòu)體*/
        GPIO_InitTypeDef GPIO_InitStructure;
        /*開啟外設(shè)時鐘*/
        RCC_APB2PeriphClockCmd(TRIG_RCC1, ENABLE);
        //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  //禁能jtag
        /*TRIG觸發(fā)信號*/                                                                                                                  
          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è)時鐘*/
          RCC_APB2PeriphClockCmd(ECHO_RCC1, ENABLE);
        /*ECOH回響信號*/                                                                                                                           
          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         初始化定時器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; //分頻系數(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)閉定時器使能 使接收到信號后再計時

}

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



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

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

當時為了分開調(diào)試 所以將端口定義的一樣 求大佬 可以幫忙看出程序的錯誤
回復(fù)

使用道具 舉報

ID:488334 發(fā)表于 2021-12-25 19:50 | 顯示全部樓層
有沒有考慮過循環(huán)開啟超聲波時,關(guān)閉其他的定時器?一個超聲波對應(yīng)一個定時器,當前超聲波開啟時,關(guān)閉其他定時器,只用當前超聲波對應(yīng)的定時器

評分

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

查看全部評分

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表