0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用STM32調(diào)試FMSDR模塊及解調(diào)FM電臺(tái)(3)

冬至子 ? 來(lái)源:硬木課堂 ? 作者:硬木課堂 ? 2023-07-06 11:00 ? 次閱讀

4. 使用MSI001解調(diào)8027發(fā)出的已知單音信號(hào)

4.1 輸出24Mhz和驗(yàn)證SPI接口

  1. 硬件連接

    本例中我們添加MSI001相關(guān)的引腳也連接到STM32H750開(kāi)發(fā)板。程序中操作的管腳如下描述:
    1.jpg

2. RCC時(shí)鐘輸出24MHz驅(qū)動(dòng)Msi001

MSI001芯片需要輸入24MHz的時(shí)鐘作為參考信號(hào),在這里使用專(zhuān)門(mén)的時(shí)鐘產(chǎn)生單元RCC產(chǎn)生24M的方波,提供給MSI001作為輸入?yún)⒖夹盘?hào)。

使能Master clock output1后,配置PLL1Q輸出為48M,MCO1選擇時(shí)鐘源為PLL1Q,經(jīng)過(guò)2分頻后,得到24M時(shí)鐘。

RCC產(chǎn)生24Mhz時(shí)鐘單元STM32CUBE配置如下:

3. 硬件SPI接口配置

芯片的控制接口是SPI協(xié)議,要使芯片正常工作,首先SPI接口的操作要正常。這里向MSI001芯片配置頻率為98.5Mhz,觀察配置前MSI001和配置后差分輸出管腳的波形變化。如果發(fā)生變化,說(shuō)明SPI操作正常,芯片可以被控。這樣進(jìn)行后續(xù)調(diào)試才有初步把握。

需要配置STM32H750的硬件SPI,然后發(fā)出控制字操作MSI001芯片,確認(rèn)板卡和芯片正常工作。SPI工作速度設(shè)為3.75Mhz.

4. 編寫(xiě)代碼

在main中使能RCC輸出,和寫(xiě)MSI001寄存器

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_I2C2_Init();
  MX_DAC1_Init();
  MX_TIM6_Init();
  MX_SPI4_Init();
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);//tim2開(kāi)啟pwm,輸出24Mhz
	for(i=0;i< SIN_ROM_LENGTH;i++)//生成sin表
	{
		sin_25_rom[i] = (uint16_t)(sin(2*3.14*i/(SIN_ROM_LENGTH))*1000 +2047);
	}
	HAL_TIM_Base_Start_IT(&htim6);//tim6開(kāi)啟
	HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);//dac1的通道1開(kāi)啟
	Qn8027_Init();	//qn8027初始化
	Msi001_Init();//msi初始化
  while (1)
  {
  }
}

添加MSI001驅(qū)動(dòng)代碼

#include "msi001/msi001.h"

SPI_HandleTypeDef *msi001_spi = &hspi4; ///

uint32_t g_msi001_reg[7]={0};//msi寄存器配置

//msi001的spi發(fā)送三個(gè)字節(jié),
HAL_StatusTypeDef Msi001_SPI_Transmit(uint32_t Data)
{
	HAL_StatusTypeDef errorcode = HAL_OK;
	uint8_t pData[4];

	pData[0] = (Data >>16)&0xFF;
	pData[1] = (Data >>8)&0xFF;
	pData[2] = (Data)&0xFF;

	errorcode = HAL_SPI_Transmit(msi001_spi,pData,3,10);
	return errorcode;
}

//msi001初始化,初始化成98.5M,改變寄存器參數(shù)配置不同頻率
HAL_StatusTypeDef Msi001_Init(void)
{
	uint32_t i=0;
	HAL_StatusTypeDef errorcode = HAL_OK;

//labview上位機(jī)配置為98.5m
	g_msi001_reg[0] = 0x043420;
	g_msi001_reg[1] = 0x00C141;
	g_msi001_reg[2] = 0x20BA12;
	g_msi001_reg[3] = 0x00FFF3;
	g_msi001_reg[4] = 0x000004;
	g_msi001_reg[5] = 0x28DF55;
	g_msi001_reg[6] = 0x200016;

	for(i=0;i< 6;i++)
	{
		errorcode = Msi001_SPI_Transmit(g_msi001_reg[i]);
	}
	return errorcode;
}

5. 測(cè)試MCO輸出的24MHz時(shí)鐘

如果方便,可以使用示波器測(cè)試stm32開(kāi)發(fā)板的PA8(RCC_MCO_1)管腳,觀測(cè)有無(wú)24M的波形輸出。

6. MSI001寫(xiě)測(cè)試

在前面程序中配置QN8027輸出的單音FM信號(hào)在98.5M上,下面我們把MSI001的接收頻點(diǎn)也配在98.5M,通過(guò)示波器查看MSI001芯片的IQ輸出的波形。

在main.c中,我們調(diào)用了SPI.c中的程序?qū)PI4進(jìn)行初始化,配置SPI的時(shí)鐘,相位等;

在MSI001.c中,我們嘗試寫(xiě)寄存器,使用示波器觀察MSI001的反應(yīng):

  1. keil中用debug單步調(diào)試,復(fù)位后,打斷點(diǎn)運(yùn)行到初始化MSI001芯片前。

  1. 運(yùn)行到下一行,配置寄存器0為0x143420后,示波器的表現(xiàn)如下:

  1. 再運(yùn)行一行,配置寄存器0為0x243420后,示波器的表現(xiàn)如下:

  1. 再運(yùn)行一行,配置寄存器0為0x043420后,示波器的表現(xiàn)如下:

如果IQ輸出能夠跟隨我們寫(xiě)入的寄存器動(dòng)作,這說(shuō)明SPI時(shí)序正確,硬件也是好的,這時(shí)我們就可以進(jìn)行下一步操作了。

注意,SPI時(shí)序?qū)懭脒@一步看上去雖然簡(jiǎn)單,卻也是最經(jīng)常出問(wèn)題的步驟。如果遇到MSI001沒(méi)有反應(yīng),建議用如下方法排查:

  1. 電源測(cè)試:MSI001供電是否正常;
  2. IO通斷測(cè)試:使用IO輸出高低電平,通過(guò)測(cè)量確定PCB焊接正確,且插對(duì)了孔位;
  3. SPI時(shí)序測(cè)試:使用示波器或邏輯分析儀捕獲發(fā)出的SPI時(shí)序,判斷是否SPI配置寄存器有錯(cuò)誤;FPGA寫(xiě)的SPI程序,則要特別留意是否有代碼bug。
  4. 如果管腳上的SPI時(shí)序正確,但MSI001如果沒(méi)有應(yīng)答,觀察是否有虛焊等情況(開(kāi)發(fā)板發(fā)貨前經(jīng)過(guò)測(cè)試,基本上可以排除電源和8027的焊接問(wèn)題)
  5. 為減少M(fèi)SI001死掉的幾率,使能STM32或FPGA管腳內(nèi)部的下拉或上拉電阻,SPI時(shí)序正常的情況下沒(méi)有反應(yīng),可以全板掉電重啟試試。

如果沒(méi)有示波器,可以使用STM32內(nèi)部ADC采集后通過(guò)UART傳到上位機(jī)觀察波形,請(qǐng)查看下一節(jié)內(nèi)容。

4.2 ADC采集和UARTPlot

1. 硬件連接

本例中我們使用CMSIS-DAP上自帶的UART2USB功能,把ADC采集到的數(shù)據(jù)發(fā)到電腦,通過(guò)UARTPlot軟件觀察采集的波形。程序中操作的管腳如下描述:

1.jpg

1.jpg

2. 配置ADC1/2同步差分輸入DMA采集

STM32處理數(shù)據(jù)流的能力遠(yuǎn)不如FPGA,要實(shí)現(xiàn)實(shí)時(shí)信號(hào)處理,在STM32中我們需要使用雙緩沖的方法,即準(zhǔn)備兩個(gè)數(shù)據(jù)段,采集A段數(shù)據(jù)的時(shí)候處理B數(shù)據(jù)段,采集B數(shù)據(jù)段的時(shí)候處理A數(shù)據(jù)段,這樣才能確保波形的連續(xù)實(shí)時(shí)處理。

本例中我們要實(shí)現(xiàn)的功能是定時(shí)器TIM1輸出TRG信號(hào)觸發(fā)ADC1和ADC2,實(shí)現(xiàn)500KSPS采樣率的DMA雙緩沖采集,采集完后通過(guò)UART發(fā)送IQ數(shù)據(jù)給上位機(jī),通過(guò)上位機(jī)軟件觀察波形。

實(shí)現(xiàn)思路如下:將DMA采集輸出長(zhǎng)度設(shè)為2000個(gè)點(diǎn),采集完前半部分1000個(gè)點(diǎn)后,進(jìn)入半回調(diào)函數(shù)HAL_ADC_ConvHalfCpltCallback中,標(biāo)志位置1;后半部分1000個(gè)點(diǎn)采集完成后,進(jìn)入HAL_ADC_ConvCpltCallback,標(biāo)志位置2,停止DMA采集;在主程序中如果標(biāo)志位等于2,就將IQ數(shù)據(jù)發(fā)送到PC上位機(jī)顯示,再開(kāi)啟DMA進(jìn)行下一幀數(shù)據(jù)采集。這樣確保我們看到的波形正確后,就可以進(jìn)入下一節(jié),進(jìn)行后面的FM解調(diào)處理。

實(shí)現(xiàn)思路框圖如下:

在while循環(huán)中,一直進(jìn)行標(biāo)志位判斷,標(biāo)志位是2時(shí),發(fā)送數(shù)據(jù)?;卣{(diào)函數(shù)和半回調(diào)函數(shù)都是通過(guò)DMA1_Stream0_IRQHandler中斷進(jìn)入。

具體ADC同步DMA采集介紹,可以回顧基礎(chǔ)實(shí)驗(yàn) “實(shí)驗(yàn)二十四 ADC定時(shí)器觸發(fā)配合DMA雙緩沖實(shí)現(xiàn)實(shí)時(shí)采集”

在程序中,添加了串口打印函數(shù)printf用于發(fā)送數(shù)據(jù)到上位機(jī),可以回顧基礎(chǔ)實(shí)驗(yàn) “實(shí)驗(yàn)十六 串口通信

3. 程序解讀

while (1)
  {

			if(g_adc1_dma_complete_flag == 2) //采集數(shù)據(jù)完成
			{
				for(i=0;i< ADC_DATA_LENGTH;i++)
				{
					adc1_I_voltage[i] = ((float)3.3*((g_adc1_dma_data1[i])&0x0000ffff))/65536; //轉(zhuǎn)換碼值為電壓值
					adc2_Q_voltage[i] =	((float)3.3*((g_adc1_dma_data1[i] >>16)&0x0000ffff))/65536; //轉(zhuǎn)換碼值為電壓值
				}

				//Send I Channel Data to PC
				for(i=0;i< ADC_DATA_LENGTH;i++)
				{
					printf("%f\\r\\n", adc1_I_voltage[i]); 
		        }
				HAL_Delay(100);//Delay

        //Send Q Channel Data to PC			
				for(i=0;i< ADC_DATA_LENGTH;i++)
				{
					printf("%f\\r\\n",adc2_Q_voltage[i]); 
				}
				HAL_Delay(100);//Delay

				//Restart DMA
				g_adc1_dma_complete_flag = 0;		
				memset(&g_adc1_dma_data1[0],0,ADC_DATA_LENGTH);				HAL_ADCEx_MultiModeStart_DMA(&hadc1,g_adc1_dma_data1,ADC_DATA_LENGTH);
			}
			/* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

4. 使用UART將波形數(shù)據(jù)發(fā)送給UARTPlot (pyserial_display) 軟件

使用串口數(shù)據(jù)接收軟件“pyserial_display.exe”的步驟:

  • 選擇CMSIS-DAP對(duì)應(yīng)的串口號(hào)
  • 設(shè)定串口波特率115200
  • 數(shù)據(jù)位8,校驗(yàn)位N,停止位1
  • 波形長(zhǎng)度2000,浮點(diǎn)類(lèi)型,雙通道模式
  • CH1是I通道波形,CH2是Q通道波形。
  • 點(diǎn)擊開(kāi)始采集,等待下位機(jī)數(shù)據(jù)。

UartPlot的使用注意事項(xiàng):

  • 確保上位機(jī)設(shè)置的UART參數(shù)(波特率、數(shù)據(jù)位、校驗(yàn)位、停止位)與大拇指開(kāi)發(fā)板中的程序設(shè)定一致。
  • 檢查波形長(zhǎng)度,通道數(shù),顯示數(shù)據(jù)格式是否和大拇指開(kāi)發(fā)板中程序一致;
  • 由于本軟件沒(méi)有使用幀頭等傳輸協(xié)議,在使用軟件時(shí), 先在UARTPlot 上位機(jī)界面上點(diǎn)擊開(kāi)始采集,然后在大拇指開(kāi)發(fā)板上啟動(dòng)數(shù)據(jù)傳輸 ,確保上位機(jī)軟件捕獲到數(shù)組的起始點(diǎn),如果沒(méi)有遵循上述啟動(dòng)流程,會(huì)出現(xiàn)波形截?cái)喱F(xiàn)象。停止上位機(jī)并重復(fù)上述流程即可修復(fù)。
  • H750例程使用的是板載DAP調(diào)試器的UART2USB功能,波特率設(shè)定為115200,上位機(jī)界面選擇USB串行設(shè)備。注意:DAP調(diào)試器在Debug模式下同時(shí)使用UART2USB功能傳輸數(shù)據(jù)可能導(dǎo)致調(diào)試器死機(jī)(死機(jī)后表現(xiàn)為DAP連不上芯片,Keil報(bào)No Debug Device Found),此時(shí)按住H750板上的BOOT0按鈕不放,重新拔插USB后下載已知可運(yùn)行程序可以解決。

一幀數(shù)據(jù)顯示

按住鼠標(biāo)左鍵,可以上下左右移動(dòng)波形,按住鼠標(biāo)右鍵,可以放大或者縮小X軸或Y軸:

點(diǎn)擊CH1或者CH2可以關(guān)閉或打開(kāi)指定通道的波形顯示

如果鼠標(biāo)不能用,在波形顯示界面點(diǎn)擊鼠標(biāo)右鍵,可以選擇是否在X軸或Y軸啟用鼠標(biāo):

在Plot Options里,可以對(duì)波形做FFT等處理

在Export里可以導(dǎo)出波形數(shù)據(jù)為JPG,或EXCEL文件

4.3 FM解調(diào)算法

1. FM解調(diào)算法回顧

求解頻率,F(xiàn)M解調(diào)

在利用相位差分計(jì)算瞬時(shí)頻率f(n)時(shí),由于計(jì)算相位要用到除法和反正切運(yùn)算,這對(duì)于非專(zhuān)用數(shù)字處理器來(lái)說(shuō)是較復(fù)雜的,在用軟件實(shí)現(xiàn)時(shí),也可用下面的方法來(lái)計(jì)算瞬時(shí)頻率f(n)

**對(duì)于FM信號(hào),其振幅近似恒定,可以設(shè)定 **,則

這就是利用XI(n)和XQ(n)計(jì)算f(n)的近似公式。這種方法只有乘法和減法,計(jì)算簡(jiǎn)便。也是開(kāi)發(fā)板例程中用到的方法。

2. 編寫(xiě)代碼

if(g_adc1_dma_complete_flag == 2)
			{
				for(i=0;i< ADC_DATA_LENGTH;i++)
				{
					adc1_I_voltage[i] = ((float)3.3*((g_adc1_dma_data1[i])&0x0000ffff))/65536;
					adc2_Q_voltage[i] =	((float)3.3*((g_adc1_dma_data1[i] >>16)&0x0000ffff))/65536;
				}

				// Send I Channel Data to PC
				for(i=0;i< ADC_DATA_LENGTH;i++)
				{
					printf("%f\\r\\n",adc1_I_voltage[i]);
				}
				HAL_Delay(200);//Delay

				// FM demodulate
				for(i=0;i< ADC_DATA_LENGTH;i++)
				{
					if (i==ADC_DATA_LENGTH-1)
					{
					adc12_fm_out[i] = adc12_fm_out[i-1];
					}
					else
					{
					adc12_fm_out[i] = (adc1_I_voltage[i]*adc2_Q_voltage[i+1] - adc1_I_voltage[i+1]*adc2_Q_voltage[i])*1;
					}	
				}

				// Send demodulated data to PC
				for(i=0;i< ADC_DATA_LENGTH;i++)
				{
					printf("%f\\r\\n",adc12_fm_out[i]);
				}
					HAL_Delay(200);//Delay

				//Restart DMA
				g_adc1_dma_complete_flag = 0;		
				memset(&g_adc1_dma_data1[0],0,ADC_DATA_LENGTH);				HAL_ADCEx_MultiModeStart_DMA(&hadc1,g_adc1_dma_data1,ADC_DATA_LENGTH);

3. FM解調(diào)測(cè)試

CH1是I通道波形,CH2是解調(diào)后的波形。

解調(diào)后波形(紅色)可以看出1KHz的成分,需要后續(xù)進(jìn)行濾波處理。

4.3 實(shí)時(shí)信號(hào)抽取和DAC輸出

1. 硬件連接

程序中操作的管腳如下描述:

1.jpg

2. 實(shí)時(shí)信號(hào)采集和500K信號(hào)抽取

STM32和FPGA不同的地方在于,MCU處理數(shù)據(jù)流的能力較弱,對(duì)于500KSPS的連續(xù)FIR濾波軟件開(kāi)銷(xiāo)較大,因此在STM32程序中我們先抽取降速后再進(jìn)行FIR濾波(下一節(jié)介紹),降低系統(tǒng)的運(yùn)算量。

本例中我們要實(shí)現(xiàn)的功能為:定時(shí)器TIM1輸出TRG信號(hào)觸發(fā)500KSPS采樣率的ADC1和ADC2,實(shí)現(xiàn)DMA雙緩沖采集,進(jìn)行實(shí)時(shí)采集->解調(diào)->每20個(gè)數(shù)據(jù)平均為1個(gè)數(shù)據(jù)->通過(guò)TIM6觸發(fā)的刷新率為25KSPS的DAC發(fā)出。最后通過(guò)示波器觀察DAC管腳波形。

定時(shí)器觸發(fā)ADC做DMA雙緩沖數(shù)據(jù)傳輸?shù)膶?shí)現(xiàn)思路是:

  1. 將DMA采集輸出長(zhǎng)度設(shè)為2000個(gè)點(diǎn),DMA配置為循環(huán)模式一直進(jìn)行自動(dòng)采集;
  2. 采集完成前1000個(gè)點(diǎn),調(diào)用半回調(diào)函數(shù)HAL_ADC_ConvHalfCpltCallback,進(jìn)行解調(diào),20次平均,如果平均后數(shù)據(jù)達(dá)到12500個(gè)后,標(biāo)志位置1,while(1)中進(jìn)行前半段12500個(gè)數(shù)據(jù)處理(DAC幅度變換,更新DAC數(shù)組);
  3. 采集完成后1000個(gè)點(diǎn),調(diào)用回調(diào)函數(shù)HAL_ADC_ConvCpltCallback,進(jìn)行解調(diào),20次平均,平均后數(shù)據(jù)如果達(dá)到25000個(gè)后,標(biāo)志位置2,在While(1)中進(jìn)行后半段12500個(gè)數(shù)據(jù)處理(DAC幅度變換,更新DAC數(shù)組)。

實(shí)現(xiàn)思路框圖如下:

具體ADC同步DMA采集介紹,可以回顧基礎(chǔ)實(shí)驗(yàn) “實(shí)驗(yàn)二十四 ADC定時(shí)器觸發(fā)配合DMA雙緩沖實(shí)現(xiàn)實(shí)時(shí)采集”:

3. While循環(huán)處理

在while循環(huán)中,一直進(jìn)行標(biāo)志位判斷,標(biāo)志位是1時(shí),處理前半部分12500個(gè)數(shù)據(jù)處理,標(biāo)志位是2時(shí),處理后半部分12500個(gè)數(shù)據(jù)處理。完成回調(diào)函數(shù)和半完成回調(diào)函數(shù)都是通過(guò)DMA1_Stream0_IRQHandler中斷進(jìn)入。

4. 編寫(xiě)代碼

在main中初始化接口,配置芯片,while循環(huán)中處理數(shù)據(jù)

int main(void)
{
uint32_t i=0;
float iq_temp=0;//臨時(shí)存儲(chǔ)
uint32_t dac2_start_flag=0;//第一次dac開(kāi)啟標(biāo)志  HAL_Init();
  SystemClock_Config();
PeriphCommonClock_Config();
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_I2C2_Init();
  MX_DAC1_Init();
  MX_TIM6_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_ADC2_Init();
  MX_TIM1_Init();
  MX_SPI4_Init();
MX_UART4_Init(); 
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);//tim2開(kāi)啟pwm,輸出24Mhz
for(i=0;i< SIN_ROM_LENGTH;i++)//生成sin表
	{
		sin_25_rom[i] = (uint16_t)(sin(2*3.14*i/(SIN_ROM_LENGTH))*1000 +2047);
	}
	HAL_TIM_Base_Start_IT(&htim6);//tim6開(kāi)啟
	HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);//dac1的通道1開(kāi)啟
	Qn8027_Init();	//qn8027初始化
	Msi001_Init();//msi初始化

	HAL_Delay(100);
	HAL_TIM_Base_Start_IT(&htim1);//tim1開(kāi)啟
	HAL_ADCEx_MultiModeStart_DMA(&hadc1,g_adc1_dma_data1,ADC_DATA_LENGTH);//ADC的dma開(kāi)始采集
  while (1)
  {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			if(g_adc1_dma_complete_flag==1)//采集完前12500個(gè)數(shù)據(jù)后,進(jìn)入這個(gè)部分
			{
				for(i=0;i< ADC_FIR_DATA_LENGTH/2;i++)//將fir濾波器輸出值幅度縮小范圍,再將直流偏置調(diào)整到1.65v,再計(jì)算出DAC對(duì)應(yīng)的碼值
				{					
					iq_fir_out[i] = iq_fir_in[i]*0.9;
					iq_temp = iq_fir_out[i]+1.65;
					iq_temp = iq_temp/3.3;
					iq_temp = iq_temp * 4095;
					audio_out_dac[i] = ((uint16_t)iq_temp)&0x0fff;
				}

				if(dac2_start_flag ==0)	//第一次進(jìn)入dac開(kāi)啟,只需第一次開(kāi)啟
				{					
					HAL_DAC_Start(&hdac1,DAC_CHANNEL_2);//dac1的通道2開(kāi)啟
					dac_phase=0;
					dac2_start_flag=1;
				}
				g_adc1_dma_complete_flag=0;
			}
			///////////////////////////////////////////////////////////////////////////////////////////////////////////////
			
			if(g_adc1_dma_complete_flag==2)//采集完后12500個(gè)數(shù)據(jù)后,進(jìn)入這個(gè)部分
			{
				for(i=ADC_FIR_DATA_LENGTH/2;i< ADC_FIR_DATA_LENGTH;i++)//將fir濾波器輸出值幅度縮小范圍,再將直流偏置調(diào)整到1.65v,再計(jì)算出DAC對(duì)應(yīng)的碼值
				{					
					iq_fir_out[i] = iq_fir_in[i]*0.9;
					iq_temp = iq_fir_out[i]+1.65;
					iq_temp = iq_temp/3.3;
					iq_temp = iq_temp * 4095;
					audio_out_dac[i] = ((uint16_t)iq_temp)&0x0fff;
				}
				g_adc1_dma_complete_flag=0;
			}  }
}

5. ADC中斷回調(diào)函數(shù)

采集完成前1000個(gè)點(diǎn),調(diào)用半回調(diào)函數(shù)HAL_ADC_ConvHalfCpltCallback,解調(diào),20次平均,如果平均后數(shù)據(jù)達(dá)到12500個(gè)后,標(biāo)志位置1。

采集完成后1000個(gè)點(diǎn),調(diào)用回調(diào)函數(shù)HAL_ADC_ConvCpltCallback,解調(diào),20次平均,平均后數(shù)據(jù)如果達(dá)到12500個(gè)后,標(biāo)志位置2

驅(qū)動(dòng)代碼:

#define ADC_DATA_LENGTH  2000   //定義采集數(shù)據(jù)長(zhǎng)度為2000
uint32_t g_adc1_dma_data1[ADC_DATA_LENGTH];//定義adc1采集數(shù)據(jù)存放數(shù)組
uint8_t g_adc1_dma_complete_flag = 0;	//adc1數(shù)據(jù)dma采集完成標(biāo)志,在dma采集完成回調(diào)函數(shù)設(shè)置
float adc1_I_voltage[ADC_DATA_LENGTH];//定義I采集數(shù)據(jù)存放數(shù)組
float adc2_Q_voltage[ADC_DATA_LENGTH];//定義Q采集數(shù)據(jù)存放數(shù)組
float adc12_iq_out[ADC_DATA_LENGTH];//定義out存放數(shù)組

#define ADC_FIR_DATA_LENGTH  25000   //定義采集數(shù)據(jù)長(zhǎng)度為1000
uint16_t audio_out_dac[ADC_FIR_DATA_LENGTH] = {0};//輸出dac
float iq_fir_in[ADC_FIR_DATA_LENGTH];//濾波前數(shù)據(jù)
float iq_fir_out[ADC_FIR_DATA_LENGTH];//濾波后數(shù)據(jù)

uint32_t iq_fir_in_cnt =0; //平均后,存放數(shù)據(jù)的下標(biāo)


//ADC回調(diào)函數(shù),ADC采集完成后進(jìn)入回調(diào)函數(shù)
//adc端口號(hào)
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{	
	uint32_t i=0,j=0;
	if(hadc- >Instance==ADC1)
		{
		for(i=ADC_DATA_LENGTH/2;i< ADC_DATA_LENGTH;i++)
		{
			adc1_I_voltage[i] = ((float)3.3*((g_adc1_dma_data1[i])&0x0000ffff))/65536;//采集到的值轉(zhuǎn)換為電壓
			adc2_Q_voltage[i] =	((float)3.3*((g_adc1_dma_data1[i] >>16)&0x0000ffff))/65536;//采集到的值轉(zhuǎn)換為電壓
		}

		//IQ通道解調(diào)
			for(i=ADC_DATA_LENGTH/2;i< ADC_DATA_LENGTH;i++)
		{			
			if (i==ADC_DATA_LENGTH-1)
					{
					adc12_iq_out[i] = adc12_iq_out[i-1];
					}
					else
					{
					adc12_iq_out[i] = (adc1_I_voltage[i]*adc2_Q_voltage[i+1] - adc1_I_voltage[i+1]*adc2_Q_voltage[i])*1;
					}
			}
		//20倍抽?。好?0個(gè)點(diǎn)求平均
		for(i=ADC_DATA_LENGTH/2/20;i< ADC_DATA_LENGTH/20;i++)
		{
			iq_fir_in[iq_fir_in_cnt] =0;
			for(j=0;j< 20;j++)
			{
				iq_fir_in[iq_fir_in_cnt] += adc12_iq_out[20*i + j]; 
			}
			iq_fir_in[iq_fir_in_cnt] = iq_fir_in[iq_fir_in_cnt]/20;//求平均
			iq_fir_in_cnt++;
			if(iq_fir_in_cnt==ADC_FIR_DATA_LENGTH/2)
			{
				g_adc1_dma_complete_flag = 1;//前半段采集完成標(biāo)志
			}
			if(iq_fir_in_cnt==ADC_FIR_DATA_LENGTH)
			{
				g_adc1_dma_complete_flag = 2;//后半段采集完成標(biāo)志
				iq_fir_in_cnt=0;
			}
		}

	}
}

//ADC半傳輸回調(diào)函數(shù),ADC采集完成一半后后進(jìn)入回調(diào)函數(shù)
//adc端口號(hào)
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc)
{
	uint32_t i=0,j=0;
	if(hadc- >Instance==ADC1)
	{

		for(i=0;i< ADC_DATA_LENGTH/2;i++)
		{
			adc1_I_voltage[i] = ((float)3.3*((g_adc1_dma_data1[i])&0x0000ffff))/65536;//采集到的值轉(zhuǎn)換為電壓
			adc2_Q_voltage[i] =	((float)3.3*((g_adc1_dma_data1[i] >>16)&0x0000ffff))/65536;//采集到的值轉(zhuǎn)換為電壓
		}

		//IQ通道解調(diào)
			for(i=0;i< ADC_DATA_LENGTH/2;i++)
		{
				  if (i==ADC_DATA_LENGTH/2-1)
					{
					adc12_iq_out[i] = adc12_iq_out[i-1];					}
					else
					{
					adc12_iq_out[i] = (adc1_I_voltage[i]*adc2_Q_voltage[i+1] - adc1_I_voltage[i+1]*adc2_Q_voltage[i])*1;
					}	
		}
		//20倍抽取,20次求平均
		for(i=0;i< ADC_DATA_LENGTH/2/20;i++)
		{
			iq_fir_in[iq_fir_in_cnt] =0;
			for(j=0;j< 20;j++)
			{
				iq_fir_in[iq_fir_in_cnt] += adc12_iq_out[20*i + j]; 
			}
			iq_fir_in[iq_fir_in_cnt] = iq_fir_in[iq_fir_in_cnt]/20;//求平均
			iq_fir_in_cnt++;
			if(iq_fir_in_cnt==ADC_FIR_DATA_LENGTH/2)
			{
				g_adc1_dma_complete_flag = 1;//前半段采集完成標(biāo)志
			}
			if(iq_fir_in_cnt==ADC_FIR_DATA_LENGTH)
			{
				g_adc1_dma_complete_flag = 2;//后半段采集完成標(biāo)志
				iq_fir_in_cnt=0;
			}
		}
	}
}

6. DAC中斷輸出

STM32H750的DAC是雙通道,其中一個(gè)通道用于在PA4管腳上輸出1k正弦波送給8027調(diào)制,另一個(gè)通道用于在PA5管腳上輸出經(jīng)過(guò)FM解調(diào)/平均/DAC變換后數(shù)據(jù)

//tim6中斷處理函數(shù),每進(jìn)入一次中斷,輸出新碼表值
void  TIM6_DAC_IRQHandler(void)
{

		__HAL_TIM_CLEAR_IT(&htim6, TIM_IT_UPDATE);//清除tim6的事件更新標(biāo)志

		if(dac_phase >= ADC_FIR_DATA_LENGTH)
		{
			dac_phase = 0;
		}
				HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_2,DAC_ALIGN_12B_R,audio_out_dac[dac_phase]);//通道2輸出
		dac_phase++;	

		if(sin_phase >= SIN_ROM_LENGTH)
		{
			sin_phase = 0;
		}
		HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,sin_25_rom[sin_phase]);//通道1輸出
		sin_phase++;
}

7. 中斷優(yōu)先級(jí)

需要注意中斷優(yōu)先級(jí),否則DAC輸出波形會(huì)出錯(cuò)。DAC優(yōu)先級(jí)必須最高。

DAC(TIM6)>DMA/ADC>TIM1.

8. PA5管腳輸出

下載編譯好的程序到開(kāi)發(fā)板。

示波器CH1是開(kāi)發(fā)板PA5管腳輸出的解調(diào)后的1KHz波形,CH2是經(jīng)過(guò)板上硬件濾波器后的1KHz。

可以看到解調(diào)后輸出波形(CH1)很多毛刺,通過(guò)模擬濾波器后,波形得到改善(CH2)。

在下一節(jié)中,我們將在MCU里給解調(diào)、抽取之后的數(shù)據(jù)使用Fir數(shù)字濾波器,這樣DAC發(fā)出波形的時(shí)候就會(huì)得到改善。

通過(guò)喇叭可以聽(tīng)到聲音。

4.4 FIR濾波器設(shè)計(jì)

**本例中是在前面3.3.3例程基礎(chǔ)上,添加FIR濾波器實(shí)現(xiàn),設(shè)計(jì)帶通濾波器,高截止頻率為3kHz,低截止頻率為100Hz。將濾波后的信號(hào)通過(guò)PA5管腳輸出。通過(guò)示波器觀察處理后DAC管腳PA5波形. **

1. 硬件連接同4.3.1節(jié)

2. 濾波器介紹

線性時(shí)不變的數(shù)字濾波器包括無(wú)限長(zhǎng)脈沖響應(yīng)濾波器(IIR濾波器)和有限長(zhǎng)脈沖響應(yīng)濾波器(FIR濾波器)兩種。這兩種濾波器的系統(tǒng)函數(shù)可以統(tǒng)一以Z變換表示為:

當(dāng)M≥1時(shí),M就是IIR濾波器階數(shù),表示系統(tǒng)反饋環(huán)的個(gè)數(shù),由于反饋的存在,IIR濾波器的脈沖響應(yīng)為無(wú)限長(zhǎng),因此得名,若A(z) = 1,則系統(tǒng)的脈沖響應(yīng)的長(zhǎng)度為N+1,故稱(chēng)為FIR濾波器。

IIR濾波器的優(yōu)點(diǎn)在于,其設(shè)計(jì)可以直接利用模擬濾波器設(shè)計(jì)的成果,因?yàn)槟M濾波器本身就是無(wú)限長(zhǎng)沖激響應(yīng)的。通常IIR濾波器設(shè)計(jì)的過(guò)程如下:首先根據(jù)濾波器參數(shù)要求設(shè)計(jì)對(duì)應(yīng)的模擬濾波器(如巴特沃斯濾波器、切比雪夫?yàn)V波器等等),然后通過(guò)映射(如脈沖響應(yīng)不變法、雙線性映射等等)將模擬濾波器變換為數(shù)字濾波器,從而決定IIR濾波器的參數(shù)。IIR濾波器的重大缺點(diǎn)在于,由于存在反饋其穩(wěn)定性不能得到保證。另外,反饋還使IIR濾波器的數(shù)字運(yùn)算可能溢出。

FIR濾波器最重要的優(yōu)點(diǎn)就是由于不存在系統(tǒng)極點(diǎn),F(xiàn)IR濾波器是絕對(duì)穩(wěn)定的系統(tǒng)。FIR濾波器還確保了線性相位,這在信號(hào)處理中也非常重要。此外,由于不需要反饋,F(xiàn)IR濾波器的實(shí)現(xiàn)也比IIR濾波器簡(jiǎn)單。FIR濾波器的缺點(diǎn)在于它的性能不如同樣階數(shù)的IIR濾波器,不過(guò)由于數(shù)字計(jì)算硬件的飛速發(fā)展,這一點(diǎn)已經(jīng)不成為問(wèn)題。再加上引入計(jì)算機(jī)輔助設(shè)計(jì),F(xiàn)IR濾波器的設(shè)計(jì)也得到極大的簡(jiǎn)化?;谏鲜鲈颍現(xiàn)IR濾波器比IIR濾波器的應(yīng)用更廣。

具體DSP濾波器介紹,可以回顧DSP實(shí)驗(yàn) “實(shí)驗(yàn)十三 DSP濾波器基礎(chǔ)知識(shí)”, “實(shí)驗(yàn)十四 DSP FIR有限沖擊濾波器設(shè)計(jì)”, “實(shí)驗(yàn)十五 DSP FIR濾波器的matlab設(shè)計(jì)(低通,高通,帶通,帶阻)”。

3. Matlab生成FIR濾波器系數(shù)

下面我們講解下如何通過(guò)Matlab的filterDesigner工具生成C頭文件,也就是生成濾波器系數(shù)。打開(kāi)應(yīng)用程序“Filter Design & Analysis”,

**filterDesigner界面打開(kāi)效果如下: **

這里重點(diǎn)介紹設(shè)置后相應(yīng)參數(shù)后如何生成濾波器系數(shù)。

**降采樣率后進(jìn)入FIR濾波器的采樣率為25KHz,現(xiàn)設(shè)計(jì)一個(gè)帶通濾波器,高截止頻率3000Hz,低截止頻率100Hz,采用函數(shù)fir1進(jìn)行設(shè)計(jì)(注意這個(gè)函數(shù)是基于窗口的方法設(shè)計(jì)FIR濾波,默認(rèn)是hamming窗),濾波器階數(shù)設(shè)置為28。filterDesigner的配置如下: **

點(diǎn)擊Design Filter按鈕以后就生成了所需的濾波器系數(shù),生成濾波器系數(shù)以后點(diǎn)擊filterDesigner界面上的菜單Targets->Generate C header** ,選擇單精度浮點(diǎn)輸出,打開(kāi)后顯示如下界面: **

然后點(diǎn)擊Generate,生成如下界面:

再點(diǎn)擊保存,并打開(kāi)fir_bandpass.h文件,可以看到生成的系數(shù),一共有29個(gè)系數(shù):

/*
 * Discrete-Time FIR Filter (real)
 * -------------------------------
 * Filter Structure  : Direct-Form FIR
 * Filter Length     : 29
 * Stable            : Yes
 * Linear Phase      : Yes (Type 1)
 */

const int BL = 29;
const real32_T B[29] = {
-0.002292175079,-0.001557604875,0.0002387679269, 0.003326080972, 0.005709242076,
   0.003126602387,-0.007875042036,  -0.0252452381, -0.03892513365, -0.03386418894,
   0.001657098066,  0.06692832708,   0.1452077776,   0.2092580795,   0.2339902967,  0.2092580795,   0.1452077776,  0.06692832708, 0.001657098066, -0.03386418894,  -0.03892513365,  -0.0252452381,-0.007875042036, 0.003126602387, 0.005709242076, 0.003326080972,0.0002387679269,-0.001557604875,-0.002292175079
};

4. KEIL添加庫(kù)文件

因需要用到DSP庫(kù),在工程中添加如下源文件。

浮點(diǎn)運(yùn)算使能

添加DSP預(yù)定義結(jié)構(gòu)

添加文件路徑

5. 編寫(xiě)代碼

在main中初始化接口,配置芯片,while循環(huán)中處理數(shù)據(jù)。

在前面工程基礎(chǔ)上添加濾波器初始化函數(shù)****arm_fir_f32_bp_init();

在while循環(huán)中添加fir濾波函數(shù)****arm_fir_f32_bp。

數(shù)據(jù)達(dá)到12500個(gè)后,處理前部分12500數(shù)據(jù)的fir濾波。

數(shù)據(jù)達(dá)到25000個(gè)后,處理后部分12500數(shù)據(jù)的fir濾波。

int main(void)
{
uint32_t i=0;
float iq_temp=0;//臨時(shí)存儲(chǔ)
uint32_t dac2_start_flag=0;//第一次dac開(kāi)啟標(biāo)志  HAL_Init();
  SystemClock_Config();
PeriphCommonClock_Config();
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_I2C2_Init();
  MX_DAC1_Init();
  MX_TIM6_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_ADC2_Init();
  MX_TIM1_Init();
  MX_SPI4_Init();
MX_UART4_Init(); 
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);//tim2開(kāi)啟pwm,輸出24Mhz
	for(i=0;i< SIN_ROM_LENGTH;i++)//生成sin表
	{
		sin_25_rom[i] = (uint16_t)(sin(2*3.14*i/(SIN_ROM_LENGTH))*1000 +2047);
	}
arm_fir_f32_bp_init();//帶通濾波器初始化
HAL_TIM_Base_Start_IT(&htim6);//tim6開(kāi)啟
HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);//dac1的通道1開(kāi)啟
Qn8027_Init();	//qn8027初始化
Msi001_Init();//msi初始化

HAL_Delay(100);
HAL_TIM_Base_Start_IT(&htim1);//tim1開(kāi)啟
HAL_ADCEx_MultiModeStart_DMA(&hadc1,g_adc1_dma_data1,ADC_DATA_LENGTH);//ADC的dma開(kāi)始采集
  while (1)
  {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			if(g_adc1_dma_complete_flag==1)//采集完前12500個(gè)數(shù)據(jù)后,進(jìn)入這個(gè)部分
			{
arm_fir_f32_bp(&iq_fir_in[0],&iq_fir_out[0]);//fir濾波器
				for(i=0;i< ADC_FIR_DATA_LENGTH/2;i++)//將fir濾波器輸出值幅度縮小范圍,再將直流偏置調(diào)整到1.65v,再計(jì)算出DAC對(duì)應(yīng)的碼值
				{					
					iq_fir_out[i] = iq_fir_in[i]*0.9;
					iq_temp = iq_fir_out[i]+1.65;
					iq_temp = iq_temp/3.3;
					iq_temp = iq_temp * 4095;
					audio_out_dac[i] = ((uint16_t)iq_temp)&0x0fff;
				}

				if(dac2_start_flag ==0)	//第一次進(jìn)入dac開(kāi)啟,只需第一次開(kāi)啟
				{					
					HAL_DAC_Start(&hdac1,DAC_CHANNEL_2);//dac1的通道2開(kāi)啟
					dac_phase=0;
					dac2_start_flag=1;
				}
				g_adc1_dma_complete_flag=0;
			}
			///////////////////////////////////////////////////////////////////////////////////////////////////////////////
			
			if(g_adc1_dma_complete_flag==2)//采集完后12500個(gè)數(shù)據(jù)后,進(jìn)入這個(gè)部分
			{
			arm_fir_f32_bp(&iq_fir_in[ADC_FIR_DATA_LENGTH/2],&iq_fir_out[ADC_FIR_DATA_LENGTH/2]);//fir濾波器
					for(i=ADC_FIR_DATA_LENGTH/2;i< ADC_FIR_DATA_LENGTH;i++)//將fir濾波器輸出值幅度縮小范圍,再將直流偏置調(diào)整到1.65v,再計(jì)算出DAC對(duì)應(yīng)的碼值
				{					
					iq_fir_out[i] = iq_fir_in[i]*0.9;
					iq_temp = iq_fir_out[i]+1.65;
					iq_temp = iq_temp/3.3;
					iq_temp = iq_temp * 4095;
					audio_out_dac[i] = ((uint16_t)iq_temp)&0x0fff;
				}
				g_adc1_dma_complete_flag=0;
			}  }
}

6. FIR實(shí)現(xiàn)

FIR濾波實(shí)現(xiàn)先初始化濾波參數(shù),在進(jìn)行數(shù)據(jù)濾波。

具體FIR濾波器實(shí)現(xiàn)講解,可以回顧DSP實(shí)驗(yàn) “實(shí)驗(yàn)十六 STM32H7的FIR低通濾波器實(shí)現(xiàn)”, “實(shí)驗(yàn)十七 STM32H7的FIR高通濾波器實(shí)現(xiàn)”。

實(shí)現(xiàn)代碼:

#define TEST_LENGTH_SAMPLES  12500    /* 采樣點(diǎn)數(shù) */
#define BLOCK_SIZE           1    	 /* 調(diào)用一次arm_fir_f32處理的采樣點(diǎn)個(gè)數(shù) */
#define NUM_TAPS             29      /* 濾波器系數(shù)個(gè)數(shù) */

uint32_t blockSize = BLOCK_SIZE;
uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE;            /* 需要調(diào)用arm_fir_f32的次數(shù) */

//static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采樣點(diǎn) */
//static float32_t testOutput[TEST_LENGTH_SAMPLES];               /* 濾波后的輸出 */
static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1];        /* 狀態(tài)緩存,大小numTaps + blockSize - 1*/


/* 濾波器系數(shù) 通過(guò)fadtool獲取*/
const float32_t firCoeffs32BP[NUM_TAPS] = {
	 -0.002292175079,-0.001557604875,0.0002387679269, 0.003326080972, 0.005709242076,
   0.003126602387,-0.007875042036,  -0.0252452381, -0.03892513365, -0.03386418894,
   0.001657098066,  0.06692832708,   0.1452077776,   0.2092580795,   0.2339902967,
     0.2092580795,   0.1452077776,  0.06692832708, 0.001657098066, -0.03386418894,
   -0.03892513365,  -0.0252452381,-0.007875042036, 0.003126602387, 0.005709242076,
   0.003326080972,0.0002387679269,-0.001557604875,-0.002292175079
};

/*
*********************************************************************************************************
*	函 數(shù) 名: arm_fir_f32_bp_ini
*	功能說(shuō)明: 調(diào)用函數(shù)arm_fir_init_f32初始化S
*	形    參:無(wú)
*	返 回 值: 無(wú)
*********************************************************************************************************
*/

arm_fir_instance_f32 S;//初始化結(jié)構(gòu)值,算fir時(shí)需要用到

void arm_fir_f32_bp_init(void)
{
	/* 初始化結(jié)構(gòu)體S */
	arm_fir_init_f32(&S,                            
					 NUM_TAPS, 
	                (float32_t *)&firCoeffs32BP[0], 
	                 &firStateF32[0], 
	                 blockSize);
}

/*
*********************************************************************************************************
*	函 數(shù) 名: arm_fir_f32_bp
*	功能說(shuō)明: 調(diào)用函數(shù)arm_fir_f32_bp實(shí)現(xiàn)帶通濾波器
*	形    參:無(wú)
*	返 回 值: 無(wú)
********************************************************************************************************
*/
void arm_fir_f32_bp(float32_t  *inputF32,float32_t *outputF32)
{
	uint32_t i;

	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_SET);
	/* 實(shí)現(xiàn)FIR濾波,這里每次處理1個(gè)點(diǎn) */
	for(i=0; i < numBlocks; i++)
	{				
		arm_fir_f32(&S, inputF32 + (i * blockSize),  outputF32 + (i * blockSize),  blockSize);
	}
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_RESET);

}

7. PA5管腳輸出

下載編譯好的程序到開(kāi)發(fā)板。

示波器CH1是開(kāi)發(fā)板PA5管腳輸出波形,CH2是PB1管腳波形。

可以看到FIR濾波輸出波形CH1是個(gè)很干凈的正弦波(臺(tái)階為采樣率,可以數(shù)出一個(gè)周期25個(gè)點(diǎn)),頻率為1kHz。CH2是通過(guò)硬件濾波器后的波形。

對(duì)比3.3.3節(jié)的波形,DAC輸出的噪聲明顯變小。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 示波器
    +關(guān)注

    關(guān)注

    113

    文章

    6150

    瀏覽量

    184129
  • RCC
    RCC
    +關(guān)注

    關(guān)注

    0

    文章

    93

    瀏覽量

    26863
  • 上位機(jī)
    +關(guān)注

    關(guān)注

    27

    文章

    929

    瀏覽量

    54670
  • PCB焊接
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    7983
  • 調(diào)試器
    +關(guān)注

    關(guān)注

    1

    文章

    297

    瀏覽量

    23640
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用STM32調(diào)試FMSDR模塊解調(diào)FM電臺(tái)(1)

    示波器:本實(shí)驗(yàn)我們使用硬木課堂的口袋儀器產(chǎn)品進(jìn)行測(cè)量
    的頭像 發(fā)表于 10-13 15:52 ?2644次閱讀
    使用<b class='flag-5'>STM32</b><b class='flag-5'>調(diào)試</b><b class='flag-5'>FMSDR</b><b class='flag-5'>模塊</b>及<b class='flag-5'>解調(diào)</b><b class='flag-5'>FM</b><b class='flag-5'>電臺(tái)</b>(1)

    使用STM32調(diào)試FMSDR模塊解調(diào)FM電臺(tái)3

    QN8027芯片需要輸入24MHz的時(shí)鐘作為參考信號(hào),在這里通過(guò)STM32H750的TIMER2產(chǎn)生24M的方波,提供給QN8027作為輸入?yún)⒖夹盘?hào)。
    的頭像 發(fā)表于 10-13 16:04 ?4886次閱讀
    使用<b class='flag-5'>STM32</b><b class='flag-5'>調(diào)試</b><b class='flag-5'>FMSDR</b><b class='flag-5'>模塊</b>及<b class='flag-5'>解調(diào)</b><b class='flag-5'>FM</b><b class='flag-5'>電臺(tái)</b>(<b class='flag-5'>3</b>)

    教你最簡(jiǎn)單做一個(gè)隨身FM電臺(tái)!X各種使用方法#電臺(tái)

    電臺(tái)FM
    Dimsmary
    發(fā)布于 :2022年07月12日 14:29:14

    FM解調(diào)器電路

    幾種FM解調(diào)器電路
    發(fā)表于 04-21 11:49 ?1903次閱讀
    <b class='flag-5'>FM</b><b class='flag-5'>解調(diào)</b>器電路

    哈爾濱文藝電臺(tái)fm頻道列表

    哈爾濱文藝電臺(tái)fm頻道列表 [FM]CH01=09980,黑龍江交通廣播CH02=10450,黑龍江生活廣播 CH03=09250,哈爾濱經(jīng)濟(jì)電臺(tái) CH04=10210,黑龍江婦女兒
    發(fā)表于 05-15 23:12 ?3744次閱讀

    FM解調(diào)器A電路

    FM解調(diào)器A電路
    發(fā)表于 03-21 19:00 ?821次閱讀
    <b class='flag-5'>FM</b><b class='flag-5'>解調(diào)</b>器A電路

    線性FM解調(diào)器電路

    線性FM解調(diào)器電路
    發(fā)表于 03-21 19:14 ?978次閱讀
    線性<b class='flag-5'>FM</b><b class='flag-5'>解調(diào)</b>器電路

    FM解調(diào)電路圖

    FM解調(diào)電路圖
    發(fā)表于 07-15 16:47 ?1092次閱讀
    <b class='flag-5'>FM</b><b class='flag-5'>解調(diào)</b>電路圖

    FM解調(diào)

    FM解調(diào)器 LM311
    發(fā)表于 09-15 10:28 ?1494次閱讀
    <b class='flag-5'>FM</b><b class='flag-5'>解調(diào)</b>器

    455KHz FM解調(diào)

    455KHz FM解調(diào)
    發(fā)表于 09-15 11:04 ?1142次閱讀
    455KHz <b class='flag-5'>FM</b><b class='flag-5'>解調(diào)</b>器

    FM調(diào)制/解調(diào)電路的設(shè)計(jì)方案分析

    ,我們得到的載波信號(hào)的電壓大于3V,最大頻率偏移5KHz,解調(diào)電路輸出的FM調(diào)制信號(hào)的電壓大于200mV可以看出我們的具體設(shè)計(jì)符合設(shè)計(jì)指標(biāo)。 關(guān)鍵詞:鎖相環(huán)、調(diào)制、解調(diào)、濾波器 一、概
    發(fā)表于 10-27 17:04 ?55次下載
    <b class='flag-5'>FM</b>調(diào)制/<b class='flag-5'>解調(diào)</b>電路的設(shè)計(jì)方案分析

    使用STM32調(diào)試FMSDR模塊解調(diào)FM電臺(tái)(2)

    當(dāng)我們使用FPGA或者STM32模塊配合FMSDR模塊使用的時(shí)候,需要從零開(kāi)始調(diào)試這個(gè)電路,逐步完成:硬件好壞判斷、8027和MSI001寄
    的頭像 發(fā)表于 10-13 15:56 ?3714次閱讀
    使用<b class='flag-5'>STM32</b><b class='flag-5'>調(diào)試</b><b class='flag-5'>FMSDR</b><b class='flag-5'>模塊</b>及<b class='flag-5'>解調(diào)</b><b class='flag-5'>FM</b><b class='flag-5'>電臺(tái)</b>(2)

    使用STM32調(diào)試FMSDR模塊解調(diào)FM電臺(tái)(1)

    當(dāng)我們使用FPGA或者STM32模塊配合FMSDR模塊使用的時(shí)候,需要從零開(kāi)始調(diào)試這個(gè)電路,逐步完成:硬件好壞判斷、8027和MSI001寄
    的頭像 發(fā)表于 07-06 10:50 ?1782次閱讀
    使用<b class='flag-5'>STM32</b><b class='flag-5'>調(diào)試</b><b class='flag-5'>FMSDR</b><b class='flag-5'>模塊</b>及<b class='flag-5'>解調(diào)</b><b class='flag-5'>FM</b><b class='flag-5'>電臺(tái)</b>(1)

    使用STM32調(diào)試FMSDR模塊解調(diào)FM電臺(tái)(2)

    本文中所有例子中我們都僅給MSI001使用天線,因?yàn)镼N8027離得很近,發(fā)射端不需要使用天線
    的頭像 發(fā)表于 07-06 10:54 ?1480次閱讀
    使用<b class='flag-5'>STM32</b><b class='flag-5'>調(diào)試</b><b class='flag-5'>FMSDR</b><b class='flag-5'>模塊</b>及<b class='flag-5'>解調(diào)</b><b class='flag-5'>FM</b><b class='flag-5'>電臺(tái)</b>(2)

    使用STM32調(diào)試FMSDR模塊解調(diào)FM電臺(tái)(4)

    本實(shí)驗(yàn)是在配置MSI001的頻點(diǎn)為101.7Mhz已知交通廣播電臺(tái),觀察喇叭是否能聽(tīng)到交通廣播聲音,再調(diào)整MSI001的輸出幅度。
    的頭像 發(fā)表于 07-06 11:05 ?1111次閱讀
    使用<b class='flag-5'>STM32</b><b class='flag-5'>調(diào)試</b><b class='flag-5'>FMSDR</b><b class='flag-5'>模塊</b>及<b class='flag-5'>解調(diào)</b><b class='flag-5'>FM</b><b class='flag-5'>電臺(tái)</b>(4)