基于STM32+DAC+DMA和AD9850的波形发生器
生活随笔
收集整理的這篇文章主要介紹了
基于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、模塊初始化
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 初始化
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的波形发生器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谈项目绩效管理
- 下一篇: 压缩文件时,自动添加日期