|
通過(guò)STM32控制DDS輸出頻率,通過(guò)按鍵控制輸入十進(jìn)制四位數(shù)字并進(jìn)行BCD編碼,輸出結(jié)果由LCD12864點(diǎn)陣液晶屏顯示
制作出來(lái)的實(shí)物圖如下:
DDS.jpg (1.84 MB, 下載次數(shù): 54)
下載附件
2022-5-25 16:20 上傳
單片機(jī)源程序如下:
- 功能:stm32f103rct6控制,25MHz時(shí)鐘, AD9959正弦波點(diǎn)頻輸出,范圍0-200M,
- 顯示:12864cog
- 接口:控制接口請(qǐng)參照AD9959.h 按鍵接口請(qǐng)參照key.h
- #include "stm32_config.h"
- #include "stdio.h"
- #include "led.h"
- #include "lcd.h"
- #include "AD9959.h"
- #include "key.h"
- #include "timer.h"
- #include "task_manage.h"
- #define Code_Freq 20 //編碼輸出頻率
- u8 delay_time = 1000/Code_Freq; //編碼延時(shí)時(shí)間
- extern u8 _return;
- int main(void)
- {
-
- MY_NVIC_PriorityGroup_Config(NVIC_PriorityGroup_2); //設(shè)置中斷分組
- delay_init(72); //初始化延時(shí)函數(shù)
- LED_Init(); //初始化LED接口
- key_init();
- Init_AD9959();
- Timerx_Init(99,71);
- initial_lcd();
- delay_ms(300);
- Timer2_Init(delay_time*5,7199); //輸出定時(shí)器初始化
- Write_frequence(0,SinFre[0]);
- while(1)
- {
- KeyRead();
- Set_PointFre(Keycode, 0);
- if(_return)
- {
- _return=0;
- LCD_Refresh_Gram();
- }
- KEY_EXIT();
- }
- }
復(fù)制代碼- #include "AD9959.H"
- #include "task_manage.h"
- u8 CSR_DATA0[1] = {0x10}; // 開(kāi) CH0
- u8 CSR_DATA1[1] = {0x20}; // 開(kāi) CH1
- u8 CSR_DATA2[1] = {0x40}; // 開(kāi) CH2
- u8 CSR_DATA3[1] = {0x80}; // 開(kāi) CH3
-
-
- u8 FR2_DATA[2] = {0x20,0x00};//default Value = 0x0000
- u8 CFR_DATA[3] = {0x00,0x03,0x02};//default Value = 0x000302
-
- u8 CPOW0_DATA[2] = {0x00,0x00};//default Value = 0x0000 @ = POW/2^14*360
-
- u8 LSRR_DATA[2] = {0x00,0x00};//default Value = 0x----
-
- u8 RDW_DATA[4] = {0x00,0x00,0x00,0x00};//default Value = 0x--------
-
- u8 FDW_DATA[4] = {0x00,0x00,0x00,0x00};//default Value = 0x--------
- //AD9959初始化
- void Init_AD9959(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- u8 FR1_DATA[3] = {0xD0,0x00,0x00};//20倍頻 Charge pump control = 75uA FR1<23> -- VCO gain control =0時(shí) system clock below 160 MHz;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); //PA,PB,PC端口時(shí)鐘使能
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_2|GPIO_Pin_7|GPIO_Pin_6|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;//初始化管腳PA2.3.4.5.6.7.8.9.10
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //IO口速度為2MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOA
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10;//初始化管腳PB0.1.10
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //IO口速度為2MHz
- GPIO_Init(GPIOB, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOB
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //初始化管腳PC0
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //IO口速度為2MHz
- GPIO_Init(GPIOC, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOC
-
- Intserve(); //IO口初始化
- IntReset(); //AD9959復(fù)位
-
- WriteData_AD9959(FR1_ADD,3,FR1_DATA,1);//寫(xiě)功能寄存器1
- WriteData_AD9959(FR2_ADD,2,FR2_DATA,1);
- // WriteData_AD9959(CFR_ADD,3,CFR_DATA,1);
- // WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,0);
- // WriteData_AD9959(ACR_ADD,3,ACR_DATA,0);
- // WriteData_AD9959(LSRR_ADD,2,LSRR_DATA,0);
- // WriteData_AD9959(RDW_ADD,2,RDW_DATA,0);
- // WriteData_AD9959(FDW_ADD,4,FDW_DATA,1);
- //寫(xiě)入初始頻率
- Write_frequence(3,SinFre[3]);
- Write_frequence(0,SinFre[0]);
- Write_frequence(1,SinFre[1]);
- Write_frequence(2,SinFre[2]);
- Write_Phase(3, SinPhr[3]);
- Write_Phase(0, SinPhr[0]);
- Write_Phase(1, SinPhr[1]);
- Write_Phase(2, SinPhr[2]);
-
- Write_Amplitude(3, SinAmp[3]);
- Write_Amplitude(0, SinAmp[0]);
- Write_Amplitude(1, SinAmp[1]);
- Write_Amplitude(2, SinAmp[2]);
- }
- //延時(shí)
- void delay1 (u32 length)
- {
- length = length*12;
- while(length--);
- }
- //IO口初始化
- void Intserve(void)
- {
- AD9959_PWR=0;
- CS = 1;
- SCLK = 0;
- UPDATE = 0;
- PS0 = 0;
- PS1 = 0;
- PS2 = 0;
- PS3 = 0;
- SDIO0 = 0;
- SDIO1 = 0;
- SDIO2 = 0;
- SDIO3 = 0;
- }
- //AD9959復(fù)位
- void IntReset(void)
- {
- Reset = 0;
- delay1(1);
- Reset = 1;
- delay1(30);
- Reset = 0;
- }
- //AD9959更新數(shù)據(jù)
- void IO_Update(void)
- {
- UPDATE = 0;
- delay1(2);
- UPDATE = 1;
- delay1(4);
- UPDATE = 0;
- }
- /*--------------------------------------------
- 函數(shù)功能:控制器通過(guò)SPI向AD9959寫(xiě)數(shù)據(jù)
- RegisterAddress: 寄存器地址
- NumberofRegisters: 所含字節(jié)數(shù)
- *RegisterData: 數(shù)據(jù)起始地址
- temp: 是否更新IO寄存器
- ----------------------------------------------*/
- void WriteData_AD9959(u8 RegisterAddress, u8 NumberofRegisters, u8 *RegisterData,u8 temp)
- {
- u8 ControlValue = 0;
- u8 ValueToWrite = 0;
- u8 RegisterIndex = 0;
- u8 i = 0;
- ControlValue = RegisterAddress;
- //寫(xiě)入地址
- SCLK = 0;
- CS = 0;
- for(i=0; i<8; i++)
- {
- SCLK = 0;
- if(0x80 == (ControlValue & 0x80))
- SDIO0= 1;
- else
- SDIO0= 0;
- SCLK = 1;
- ControlValue <<= 1;
- }
- SCLK = 0;
- //寫(xiě)入數(shù)據(jù)
- for (RegisterIndex=0; RegisterIndex<NumberofRegisters; RegisterIndex++)
- {
- ValueToWrite = RegisterData[RegisterIndex];
- for (i=0; i<8; i++)
- {
- SCLK = 0;
- if(0x80 == (ValueToWrite & 0x80))
- SDIO0= 1;
- else
- SDIO0= 0;
- SCLK = 1;
- ValueToWrite <<= 1;
- }
- SCLK = 0;
- }
- if(temp != 0)
- IO_Update();
- CS = 1;
- }
- /*---------------------------------------
- 函數(shù)功能:設(shè)置通道輸出頻率
- Channel: 輸出通道
- Freq: 輸出頻率
- ---------------------------------------*/
- void Write_frequence(u8 Channel,u32 Freq)
- {
- u8 CFTW0_DATA[4] ={0x00,0x00,0x00,0x00}; //中間變量
- u32 Temp;
- Temp=(u32)Freq*8.589934592; //將輸入頻率因子分為四個(gè)字節(jié) 8.589934592=(2^32)/500000000 其中500M=25M*20(倍頻數(shù)可編程)
- CFTW0_DATA[3]=(u8)Temp;
- CFTW0_DATA[2]=(u8)(Temp>>8);
- CFTW0_DATA[1]=(u8)(Temp>>16);
- CFTW0_DATA[0]=(u8)(Temp>>24);
- if(Channel==0)
- {
- WriteData_AD9959(CSR_ADD,1,CSR_DATA0,1);//控制寄存器寫(xiě)入CH0通道
- WriteData_AD9959(CFTW0_ADD,4,CFTW0_DATA,1);//CTW0 address 0x04.輸出CH0設(shè)定頻率
- }
- else if(Channel==1)
- {
- WriteData_AD9959(CSR_ADD,1,CSR_DATA1,1);//控制寄存器寫(xiě)入CH1通道
- WriteData_AD9959(CFTW0_ADD,4,CFTW0_DATA,1);//CTW0 address 0x04.輸出CH1設(shè)定頻率
- }
- else if(Channel==2)
- {
- WriteData_AD9959(CSR_ADD,1,CSR_DATA2,1);//控制寄存器寫(xiě)入CH2通道
- WriteData_AD9959(CFTW0_ADD,4,CFTW0_DATA,1);//CTW0 address 0x04.輸出CH2設(shè)定頻率
- }
- else if(Channel==3)
- {
- WriteData_AD9959(CSR_ADD,1,CSR_DATA3,1);//控制寄存器寫(xiě)入CH3通道
- WriteData_AD9959(CFTW0_ADD,4,CFTW0_DATA,1);//CTW0 address 0x04.輸出CH3設(shè)定頻率
- }
-
- }
- /*---------------------------------------
- 函數(shù)功能:設(shè)置通道輸出幅度
- Channel: 輸出通道
- Ampli: 輸出幅度
- ---------------------------------------*/
- void Write_Amplitude(u8 Channel, u16 Ampli)
- {
- u16 A_temp;//=0x23ff;
- u8 ACR_DATA[3] = {0x00,0x00,0x00};//default Value = 0x--0000 Rest = 18.91/Iout
-
- A_temp=Ampli|0x1000;
- ACR_DATA[2] = (u8)A_temp; //低位數(shù)據(jù)
- ACR_DATA[1] = (u8)(A_temp>>8); //高位數(shù)據(jù)
- if(Channel==0)
- {
- WriteData_AD9959(CSR_ADD,1,CSR_DATA0,1);
- WriteData_AD9959(ACR_ADD,3,ACR_DATA,1);
- }
- else if(Channel==1)
- {
- WriteData_AD9959(CSR_ADD,1,CSR_DATA1,1);
- WriteData_AD9959(ACR_ADD,3,ACR_DATA,1);
- }
- else if(Channel==2)
- {
- WriteData_AD9959(CSR_ADD,1,CSR_DATA2,1);
- WriteData_AD9959(ACR_ADD,3,ACR_DATA,1);
- }
- else if(Channel==3)
- {
- WriteData_AD9959(CSR_ADD,1,CSR_DATA3,1);
- WriteData_AD9959(ACR_ADD,3,ACR_DATA,1);
- }
- }
- /*---------------------------------------
- 函數(shù)功能:設(shè)置通道輸出相位
- Channel: 輸出通道
- Phase: 輸出相位,范圍:0~16383(對(duì)應(yīng)角度:0°~360°)
- ---------------------------------------*/
- void Write_Phase(u8 Channel,u16 Phase)
- {
- u16 P_temp=0;
- P_temp=(u16)Phase;
- CPOW0_DATA[1]=(u8)P_temp;
- CPOW0_DATA[0]=(u8)(P_temp>>8);
- if(Channel==0)
- {
- WriteData_AD9959(CSR_ADD,1,CSR_DATA0,1);
- WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,1);
- }
- else if(Channel==1)
- {
- WriteData_AD9959(CSR_ADD,1,CSR_DATA1,1);
- WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,1);
- }
- else if(Channel==2)
- {
- WriteData_AD9959(CSR_ADD,1,CSR_DATA2,1);
- WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,1);
- }
- else if(Channel==3)
- {
- WriteData_AD9959(CSR_ADD,1,CSR_DATA3,1);
- WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,1);
- }
- }
復(fù)制代碼 Keil5代碼下載(僅供參考):
代碼.7z
(230.54 KB, 下載次數(shù): 36)
2022-5-25 16:33 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|