欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
stm32單片機尋聲小車源程序 用麥克風陣列模塊辨別出聲源的方位
[打印本頁]
作者:
836329106
時間:
2022-12-4 23:38
標題:
stm32單片機尋聲小車源程序 用麥克風陣列模塊辨別出聲源的方位
使用聲音矩陣模塊辨別出聲源的方位,聲音的大小可以反映出小車與聲源的距離。
基于以上兩點在空曠無回音的地點找到聲源,希望感興趣的朋友們可以繼續完善算法,客服噪聲、回音等等問題
驅動是用的l298n,加裝了兩個光電傳感器實現尋聲過程中基本避障功能。
單片機源程序如下:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "adc.h"
#include "dma.h"
#include "moto.h"
#include "pwm.h"
#include "oled.h"
#include "key.h"
float Mv=0; //平均值
int S=0; //模擬聲音大小
float Jvalue(float a);//數據處理,類似絕對值
u16 adcx[6]; //ADC采樣數組
extern u8 guangdian;
void Display(void);//顯示
int main(void)//主函數
{
// int i;//循環變量
// float adc1,adc2,adc3,adc4,adc5,adc6; //ADC采樣值
// float v1,v2,v3,v4,v5,v6;//數據值
delay_init(); //延時函數初始化
SystemInit();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
uart_init(115200); //串口初始化為115200
LED_Init(); //LED端口初始化
MOTO_GPIO_Config(); //電機初始化
OLED_Init(); //OLED初始化
KEY_Init();
OLED_ColorTurn(0);//0正常顯示,1 反色顯示
OLED_DisplayTurn(0);//0正常顯示 1 屏幕翻轉顯示
GPIO_SetBits(GPIOB,GPIO_Pin_6); //LED0對應引腳GPIOB.5拉低,亮 等同LED0=0;
GPIO_SetBits(GPIOB,GPIO_Pin_7); //LED0對應引腳GPIOB.5拉低,亮 等同LED0=0;
delay_ms(1000); //延時啟動
GPIO_ResetBits(GPIOB,GPIO_Pin_7); //LED1對應引腳GPIOE.5拉高,滅 等同LED1=1;
delay_ms(1000); //延時啟動
GPIO_SetBits(GPIOB,GPIO_Pin_6); //LED0對應引腳GPIOB.5拉低,亮 等同LED0=0;
GPIO_SetBits(GPIOB,GPIO_Pin_7); //LED0對應引腳GPIOB.5拉低,亮 等同LED0=0;
TIM1_PWM_Init(100,36); //PWM初始化
MYDMA_Config(DMA1_Channel1,(u32)(&ADC1->DR),(u32)adcx,6);//DMA1通道1,外設為串口1,存儲器為SendBuff,長度SEND_BUF_SIZE.
Adc_Init(); //ADC初始化
TIM_SetCompare1(TIM1,25); //占空比=1-25/100
TIM_SetCompare3(TIM1,25);
TIM3_Int_Init(10,35999);
delay_ms(400); //延時啟動
while(1) //主循環
{
// v1=0;v2=0;v3=0;v4=0;v5=0;v6=0; //清零
// for(i=500;i>0;i--) //循環檢測500次
// {
// adc1=(float)(adcx[0])*(3.3/4096); //獲取計算后的帶小數的實際電壓值,比如3.1111
// v1+=Jvalue(adc1)*0.6;
// adc2=(float)(adcx[1])*(3.3/4096); //獲取計算后的帶小數的實際電壓值,比如3.1111
// v2+=Jvalue(adc2);
// adc3=(float)(adcx[2])*(3.3/4096); //獲取計算后的帶小數的實際電壓值,比如3.1111
// v3+=Jvalue(adc3);
// adc4=(float)(adcx[3])*(3.3/4096); //獲取計算后的帶小數的實際電壓值,比如3.1111
// v4+=Jvalue(adc4);
// adc5=(float)(adcx[4])*(3.3/4096); //獲取計算后的帶小數的實際電壓值,比如3.1111
// v5+=Jvalue(adc5)*0.4;
// adc6=(float)(adcx[5])*(3.3/4096); //獲取計算后的帶小數的實際電壓值,比如3.1111
// v6+=Jvalue(adc6);
// }
// Mv=(v1+v2+v3+v4+v5+v6)/6; //求平均
//// Display(); //顯示
//// delay_ms(2000); //延時啟動
// if((v1+v2+v3+v4+v5+v6)<120) //太遠
// {
// Car_Stop(); //停車
// }
// else if((v1+v2+v3+v4+v5+v6)>1800)//太近
// {
// Car_Stop();
// }
// else //正常范圍
// {
// if(1) //聲源在前側
// {
// if((v6)>(v2)) //聲源在左邊
// {
// Car_Turn_Left();//左轉
// S++; //模擬聲音大小值
// }
// else if((v2)>(v6))//聲源在右邊
// {
// Car_Turn_Right(); //右轉
// S++;
// }
// else //聲源在中間
// {
// Car_Go(); //前進
// S++;
// }
// }
// else //聲源在后側
// {
// Car_RRight();//原地右轉
// }
////// Car_RRight();//原地右轉
////// Car_Go(); //前進
////// Car_Turn_Left();//左轉
//// Car_Turn_Right(); //右轉
// }
}
}
float Jvalue(float a) //數據處理,將正負變換的數據轉換成正誤差
{
float b;
if(a>=1.65)
{
b=a-1.65;
}
else
{
b=1.65-a;
}
return b;
}
void Display(void)//數據顯示
{
OLED_ShowChinese(0,1,18,16,1);//"聲"
OLED_ShowChinese(18,1,19,16,1);//"音"
OLED_ShowChinese(36,1,9,16,1);//":"
OLED_ShowNum(45,1,Mv,4,16,1);
OLED_ShowChar(80,1,'d',16,1);
OLED_ShowChar(90,1,'B',16,1);
OLED_ShowChinese(0,20,0,16,1);//"路"
OLED_ShowChinese(18,20,1,16,1);//"程"
OLED_ShowChinese(36,20,2,16,1);//":"
OLED_ShowNum(45,20,S,4,16,1);
OLED_ShowChar(80,20,'c',16,1);
OLED_ShowChar(89,20,'m',16,1);
OLED_ShowNum(45,40,guangdian,4,16,1);
OLED_Refresh();//更新顯存到OLED
}
復制代碼
Keil代碼下載:
程序源碼.7z
(222.8 KB, 下載次數: 31)
2022-12-5 03:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
2717876846
時間:
2023-10-10 11:27
樓主原理圖
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1