日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于STM32+DAC+DMA和AD9850的波形发生器

發布時間:2023/12/31 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于STM32+DAC+DMA和AD9850的波形发生器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于STM32+DAC+DMA和AD9850的波形發生器

試驗目的

一、通過STM32單片機DAC+DMA產生頻率可調正弦波、三角波、鋸齒波、方波。
二、使用STM32驅動AD9850波形發生模塊產生正弦波和方波。

一、AD9850/AD9851的簡介
AD9850/AD9851 模塊是采用 ADI 應用最廣泛的 DDS(AD9850 和 AD9851)制作的模塊。

主要功能特點:
模塊能夠輸出正弦波和方波,2 個正弦波和 2 個方波輸出。
 AD9850: 0-40MHz
 AD9851: 0-70MHz
 頻率在 20-30MHz 后諧波越來越大,波形會越來越不干凈。
 方波: 0-1MHz
采用 70MHz 的低通濾波器,使波形的 SN 比更好
比較器的基準輸入端電壓由可變電阻產生,調節該電阻可以得到不同的占空比方波
AD9850 模塊采用 125MHz 的有源晶振,AD9851 模塊采用 30MHZ 的有源晶振

二、AD9850驅動程序
1、模塊初始化

/******************************************** 函數名稱:Init_AD9834(主要是初始化GPIO) 功 能:初始化AD9834 參 數:無 返回值 :無 *********************************************/ void Init_AD9850(void) { #ifdef MODE_SEIAL //串行模式GPIO_InitTypeDef GPIO_InitStructure ;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);GPIO_InitStructure.GPIO_Pin = AD9850_WCLK | AD9850_FQUD | AD9850_RST | AD9850_DATA ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(AD9850_CONTROL_PORT ,&GPIO_InitStructure) ;AD9850_Reset_Sreial() ; #endif#ifdef MODE_PARALLEL //并行模式GPIO_InitTypeDef GPIO_InitStructure ;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO , ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);//?GPIO_InitStructure.GPIO_Pin = AD9850_WCLK | AD9850_FQUD | AD9850_RST ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出GPIO_Init(AD9850_CONTROL_PORT ,&GPIO_InitStructure) ;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All ;//可以GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(AD9850_DATA_PORT ,&GPIO_InitStructure);AD9850_Reset_Parallel() ;//并行模式下復位AD9850 #endif} /******************************************** 函數名稱:AD9850_Reset_Sreial 功 能:在串行模式下復位AD9850 參 數:無 返回值 :無 *********************************************/ void AD9850_Reset_Sreial(void) {AD9850_WCLK_CLR ;AD9850_FQUD_CLR ;//RST信號AD9850_RST_CLR ;AD9850_RST_SET ; // AD9850_Delay(0xFFFF) ;delay_ms(3);AD9850_RST_CLR ;//WCLK信號AD9850_WCLK_CLR ;AD9850_WCLK_SET ; // AD9850_Delay(0xFFFF) ;delay_ms(3);AD9850_WCLK_CLR ;//FQUD信號AD9850_FQUD_CLR ;AD9850_FQUD_SET ; // AD9850_Delay(0xFFFF) ;delay_ms(3);AD9850_FQUD_CLR ; }

2、串行模式數據寫入

/******************************************** 函數名稱:AD9850_Write_Serial 功 能:在串行模式下寫AD9850寄存器 參 數:W0 - W0寄存器的值freq - 頻率值 返回值 :無 *********************************************/ void AD9850_Write_Serial(unsigned char W0,unsigned long freq) {unsigned char i,wdata ;unsigned long y ;y=4294967296.0/125;y*=(((float)freq)/1000000);wdata = y>>0 ; //寫w4for(i=0 ;i<8 ;i++){if(wdata & 0x01)AD9850_DATA_Write_1 ;elseAD9850_DATA_Write_0 ;AD9850_WCLK_SET ;wdata >>= 1 ;AD9850_WCLK_CLR ;}wdata = y>>8 ; //寫w3for(i=0 ;i<8 ;i++){if(wdata & 0x01)AD9850_DATA_Write_1 ;elseAD9850_DATA_Write_0 ;AD9850_WCLK_SET ;wdata >>= 1 ;AD9850_WCLK_CLR ;}wdata = y>>16 ; //寫w2for(i=0 ;i<8 ;i++){if(wdata & 0x01)AD9850_DATA_Write_1 ;elseAD9850_DATA_Write_0 ;AD9850_WCLK_SET ;wdata >>= 1 ;AD9850_WCLK_CLR ;}wdata = y>>24 ; //寫w1for(i=0 ;i<8 ;i++){if(wdata & 0x01)AD9850_DATA_Write_1 ;elseAD9850_DATA_Write_0 ;AD9850_WCLK_SET ;wdata >>= 1 ;AD9850_WCLK_CLR ;}wdata = W0 ; //寫w0for(i=0 ;i<8 ;i++){if(wdata & 0x01)AD9850_DATA_Write_1 ;elseAD9850_DATA_Write_0 ;AD9850_WCLK_SET ;wdata >>= 1 ;AD9850_WCLK_CLR ;}AD9850_FQUD_SET ; //移入使能 // AD9850_Delay(0xFFFF) ;AD9850_FQUD_CLR ; }

三、基于STM32+DAC+DMA 的波形發生器
1、DAC DMA 初始化

void Wave_Init(u16 Wave1_Fre,float Um_H,float Um_l) {u32 Freq;Freq=(u32)(72000000/sizeof(SineWave_Value)*2/Wave1_Fre);//計算頻率// SquareWave_Data(256,SineWave_Value,Um_H,Um_l);//產生方波 // SineWave_Data(256,SineWave_Value,Um_H);//產生正弦波TriangleWave_Data(256,SineWave_Value,Um_H);//產生三角波 // SawTooth_Data(256,SineWave_Value,Um_H);//產生鋸齒波SineWave_GPIO_Config(); //初始化ioSineWave_TIM_Config(Freq); //初始化定時器SineWave_DAC_Config(); //配置DACSineWave_DMA_Config(); //配置DMATIM_Cmd(TIM2, ENABLE); }

2、生成波形數據表

/********生成正弦波輸出表***********/ //cycle :波形表的位數 (0~256) //Um :輸出電壓的峰值(0~1.5) /*******************************/ void SineWave_Data( u16 cycle ,u16 *D,float Um) {u16 i;for( i=0;i<cycle;i++){D[i]=(u16)((Um*sin(( 1.0*i/(cycle-1))*2*PI)+Um)*4095/3.3);} } /********生成方波輸出表***********/ //cycle :波形表的位數 (0~256) //Um :輸出電壓 /*******************************/ void SquareWave_Data( u16 cycle ,u16 *D,float Um_H,float Um_L) {u16 i;float daH=0,daL=0;daH=4095*Um_H/3.3f;daL=4095*Um_L/3.3f;for(i=0;i<256/2;i++){D[i]= (u16)(daL);}for( i=256/2;i<256;i++){D[i]=(u16)(daH);} } /********生成三角波輸出表***********/ //cycle :波形表的位數 (0~256) //Um :輸出電壓的峰值(0~1.5) /*******************************/ void TriangleWave_Data( u16 cycle ,u16 *D,float Um) {u16 i;int n=1;for( i=0;i<cycle;i++){if(i<cycle/2){D[i]= (u16)(1.0*i/255*4095);}else{D[i]= (u16)(1.0*(i-2*n)/255*4095);n++;}} } /********生成鋸齒波形輸出表***********/ //cycle :波形表的位數 (0~256) //Um :輸出電壓 /*******************************/ void SawTooth_Data( u16 cycle ,u16 *D,float Um) {u16 i;for( i=0;i<cycle;i++){ D[i]= (u16)(1.0*i/255*4095);} }

3、主函數

int main(void) { uint32_t FREQ=10000;u8 p[250];delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);uart_init(115200);Init_AD9850();LED_Init();LCD_Init();LCD_Clear(BLACK);BACK_COLOR = BLACK;POINT_COLOR = WHITE;LCD_ShowString(50,40,200,24,24,(u8*)"AD9850 TEST");AD9850_Write_Serial(0x00,FREQ);sprintf((char*)p,"Freq : %d KHz",FREQ/1000);if(FREQ>=1000000) sprintf((char*)p,"Freq : %d MHz",FREQ/1000000);LCD_ShowString(30,100,200,24,24,p);Wave_Init(SquareFreq,SquareV_H,SquareV_L); while(1){ LED0=!LED0; delay_ms(250);} }

四、調試波形




總結

以上是生活随笔為你收集整理的基于STM32+DAC+DMA和AD9850的波形发生器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。