久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3560|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32單片機(jī)控制AD9959 DDS和編碼輸出數(shù)字信號(hào) 正弦波點(diǎn)頻輸出源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
通過(guò)STM32控制DDS輸出頻率,通過(guò)按鍵控制輸入十進(jìn)制四位數(shù)字并進(jìn)行BCD編碼,輸出結(jié)果由LCD12864點(diǎn)陣液晶屏顯示
制作出來(lái)的實(shí)物圖如下:

單片機(jī)源程序如下:
  1. 功能:stm32f103rct6控制,25MHz時(shí)鐘, AD9959正弦波點(diǎn)頻輸出,范圍0-200M,
  2.                         顯示:12864cog
  3. 接口:控制接口請(qǐng)參照AD9959.h  按鍵接口請(qǐng)參照key.h
  4. #include "stm32_config.h"
  5. #include "stdio.h"
  6. #include "led.h"
  7. #include "lcd.h"
  8. #include "AD9959.h"
  9. #include "key.h"
  10. #include "timer.h"
  11. #include "task_manage.h"
  12. #define   Code_Freq 20   //編碼輸出頻率
  13. u8 delay_time = 1000/Code_Freq;  //編碼延時(shí)時(shí)間           

  14. extern u8 _return;
  15. int main(void)
  16. {
  17.         
  18.         MY_NVIC_PriorityGroup_Config(NVIC_PriorityGroup_2);        //設(shè)置中斷分組
  19.         delay_init(72);        //初始化延時(shí)函數(shù)
  20.         LED_Init();        //初始化LED接口
  21.         key_init();
  22.         Init_AD9959();
  23.         Timerx_Init(99,71);
  24.         initial_lcd();
  25.   delay_ms(300);
  26.         Timer2_Init(delay_time*5,7199); //輸出定時(shí)器初始化
  27.   Write_frequence(0,SinFre[0]);
  28.         while(1)
  29.         {

  30.                 KeyRead();
  31.                 Set_PointFre(Keycode, 0);
  32.                 if(_return)
  33.                 {
  34.                         _return=0;
  35.                         LCD_Refresh_Gram();
  36.                 }
  37.                 KEY_EXIT();
  38.         }        
  39. }
復(fù)制代碼
  1. #include "AD9959.H"
  2. #include "task_manage.h"

  3. u8 CSR_DATA0[1] = {0x10};     // 開(kāi) CH0
  4. u8 CSR_DATA1[1] = {0x20};      // 開(kāi) CH1
  5. u8 CSR_DATA2[1] = {0x40};      // 開(kāi) CH2
  6. u8 CSR_DATA3[1] = {0x80};      // 開(kāi) CH3               
  7.                                                                                                                                        

  8. u8 FR2_DATA[2] = {0x20,0x00};//default Value = 0x0000
  9. u8 CFR_DATA[3] = {0x00,0x03,0x02};//default Value = 0x000302           
  10.                                                                                                                                        
  11. u8 CPOW0_DATA[2] = {0x00,0x00};//default Value = 0x0000   @ = POW/2^14*360
  12.                                                                                                                                        


  13. u8 LSRR_DATA[2] = {0x00,0x00};//default Value = 0x----
  14.                                                                                                                                        
  15. u8 RDW_DATA[4] = {0x00,0x00,0x00,0x00};//default Value = 0x--------
  16.                                                                                                                                        
  17. u8 FDW_DATA[4] = {0x00,0x00,0x00,0x00};//default Value = 0x--------

  18. //AD9959初始化
  19. void Init_AD9959(void)  
  20. {
  21.         GPIO_InitTypeDef  GPIO_InitStructure;      
  22.          u8 FR1_DATA[3] = {0xD0,0x00,0x00};//20倍頻 Charge pump control = 75uA FR1<23> -- VCO gain control =0時(shí) system clock below 160 MHz;
  23.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);         //PA,PB,PC端口時(shí)鐘使能
  24.         
  25.         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
  26.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  27.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                 //IO口速度為2MHz
  28.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根據(jù)設(shè)定參數(shù)初始化GPIOA
  29.         
  30.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10;//初始化管腳PB0.1.10                        
  31.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  32.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                 //IO口速度為2MHz
  33.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根據(jù)設(shè)定參數(shù)初始化GPIOB
  34.         
  35.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;        //初始化管腳PC0                        
  36.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  37.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                 //IO口速度為2MHz
  38.         GPIO_Init(GPIOC, &GPIO_InitStructure);                                         //根據(jù)設(shè)定參數(shù)初始化GPIOC
  39.                
  40.         Intserve();  //IO口初始化
  41.   IntReset();  //AD9959復(fù)位  
  42.         
  43.   WriteData_AD9959(FR1_ADD,3,FR1_DATA,1);//寫(xiě)功能寄存器1
  44.   WriteData_AD9959(FR2_ADD,2,FR2_DATA,1);
  45. //  WriteData_AD9959(CFR_ADD,3,CFR_DATA,1);
  46. //  WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,0);
  47. //  WriteData_AD9959(ACR_ADD,3,ACR_DATA,0);
  48. //  WriteData_AD9959(LSRR_ADD,2,LSRR_DATA,0);
  49. //  WriteData_AD9959(RDW_ADD,2,RDW_DATA,0);
  50. //  WriteData_AD9959(FDW_ADD,4,FDW_DATA,1);
  51.    //寫(xiě)入初始頻率
  52.         Write_frequence(3,SinFre[3]);
  53.         Write_frequence(0,SinFre[0]);
  54.         Write_frequence(1,SinFre[1]);
  55.         Write_frequence(2,SinFre[2]);

  56.         Write_Phase(3, SinPhr[3]);
  57.         Write_Phase(0, SinPhr[0]);
  58.         Write_Phase(1, SinPhr[1]);
  59.         Write_Phase(2, SinPhr[2]);
  60.         
  61.         Write_Amplitude(3, SinAmp[3]);
  62.         Write_Amplitude(0, SinAmp[0]);
  63.         Write_Amplitude(1, SinAmp[1]);
  64.         Write_Amplitude(2, SinAmp[2]);
  65. }
  66. //延時(shí)
  67. void delay1 (u32 length)
  68. {
  69.         length = length*12;
  70.    while(length--);
  71. }
  72. //IO口初始化
  73. void Intserve(void)                  
  74. {   
  75.                 AD9959_PWR=0;
  76.     CS = 1;
  77.     SCLK = 0;
  78.     UPDATE = 0;
  79.     PS0 = 0;
  80.     PS1 = 0;
  81.     PS2 = 0;
  82.     PS3 = 0;
  83.     SDIO0 = 0;
  84.     SDIO1 = 0;
  85.     SDIO2 = 0;
  86.     SDIO3 = 0;
  87. }
  88. //AD9959復(fù)位
  89. void IntReset(void)         
  90. {
  91.   Reset = 0;
  92.         delay1(1);
  93.         Reset = 1;
  94.         delay1(30);
  95.         Reset = 0;
  96. }
  97. //AD9959更新數(shù)據(jù)
  98. void IO_Update(void)  
  99. {
  100.         UPDATE = 0;
  101.         delay1(2);
  102.         UPDATE = 1;
  103.         delay1(4);
  104.         UPDATE = 0;
  105. }
  106. /*--------------------------------------------
  107. 函數(shù)功能:控制器通過(guò)SPI向AD9959寫(xiě)數(shù)據(jù)
  108. RegisterAddress: 寄存器地址
  109. NumberofRegisters: 所含字節(jié)數(shù)
  110. *RegisterData: 數(shù)據(jù)起始地址
  111. temp: 是否更新IO寄存器
  112. ----------------------------------------------*/
  113. void WriteData_AD9959(u8 RegisterAddress, u8 NumberofRegisters, u8 *RegisterData,u8 temp)
  114. {
  115.         u8        ControlValue = 0;
  116.         u8        ValueToWrite = 0;
  117.         u8        RegisterIndex = 0;
  118.         u8        i = 0;

  119.         ControlValue = RegisterAddress;
  120. //寫(xiě)入地址
  121.         SCLK = 0;
  122.         CS = 0;         
  123.         for(i=0; i<8; i++)
  124.         {
  125.                 SCLK = 0;
  126.                 if(0x80 == (ControlValue & 0x80))
  127.                 SDIO0= 1;         
  128.                 else
  129.                 SDIO0= 0;         
  130.                 SCLK = 1;
  131.                 ControlValue <<= 1;
  132.         }
  133.         SCLK = 0;
  134. //寫(xiě)入數(shù)據(jù)
  135.         for (RegisterIndex=0; RegisterIndex<NumberofRegisters; RegisterIndex++)
  136.         {
  137.                 ValueToWrite = RegisterData[RegisterIndex];
  138.                 for (i=0; i<8; i++)
  139.                 {
  140.                         SCLK = 0;
  141.                         if(0x80 == (ValueToWrite & 0x80))
  142.                         SDIO0= 1;         
  143.                         else
  144.                         SDIO0= 0;         
  145.                         SCLK = 1;
  146.                         ValueToWrite <<= 1;
  147.                 }
  148.                 SCLK = 0;               
  149.         }        
  150.         if(temp != 0)
  151.         IO_Update();        
  152.   CS = 1;
  153. }
  154. /*---------------------------------------
  155. 函數(shù)功能:設(shè)置通道輸出頻率
  156. Channel:  輸出通道
  157. Freq:     輸出頻率
  158. ---------------------------------------*/
  159. void Write_frequence(u8 Channel,u32 Freq)
  160. {         
  161.                 u8 CFTW0_DATA[4] ={0x00,0x00,0x00,0x00};        //中間變量
  162.           u32 Temp;            
  163.           Temp=(u32)Freq*8.589934592;           //將輸入頻率因子分為四個(gè)字節(jié)  8.589934592=(2^32)/500000000 其中500M=25M*20(倍頻數(shù)可編程)
  164.           CFTW0_DATA[3]=(u8)Temp;
  165.           CFTW0_DATA[2]=(u8)(Temp>>8);
  166.           CFTW0_DATA[1]=(u8)(Temp>>16);
  167.           CFTW0_DATA[0]=(u8)(Temp>>24);
  168.           if(Channel==0)         
  169.           {
  170.                         WriteData_AD9959(CSR_ADD,1,CSR_DATA0,1);//控制寄存器寫(xiě)入CH0通道
  171.       WriteData_AD9959(CFTW0_ADD,4,CFTW0_DATA,1);//CTW0 address 0x04.輸出CH0設(shè)定頻率
  172.                 }
  173.           else if(Channel==1)        
  174.           {
  175.                         WriteData_AD9959(CSR_ADD,1,CSR_DATA1,1);//控制寄存器寫(xiě)入CH1通道
  176.       WriteData_AD9959(CFTW0_ADD,4,CFTW0_DATA,1);//CTW0 address 0x04.輸出CH1設(shè)定頻率        
  177.           }
  178.           else if(Channel==2)        
  179.           {
  180.                         WriteData_AD9959(CSR_ADD,1,CSR_DATA2,1);//控制寄存器寫(xiě)入CH2通道
  181.       WriteData_AD9959(CFTW0_ADD,4,CFTW0_DATA,1);//CTW0 address 0x04.輸出CH2設(shè)定頻率        
  182.           }
  183.           else if(Channel==3)        
  184.           {
  185.                         WriteData_AD9959(CSR_ADD,1,CSR_DATA3,1);//控制寄存器寫(xiě)入CH3通道
  186.       WriteData_AD9959(CFTW0_ADD,4,CFTW0_DATA,1);//CTW0 address 0x04.輸出CH3設(shè)定頻率        
  187.           }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
  188.         
  189. }
  190. /*---------------------------------------
  191. 函數(shù)功能:設(shè)置通道輸出幅度
  192. Channel:  輸出通道
  193. Ampli:    輸出幅度
  194. ---------------------------------------*/
  195. void Write_Amplitude(u8 Channel, u16 Ampli)
  196. {
  197.         u16 A_temp;//=0x23ff;
  198.         u8 ACR_DATA[3] = {0x00,0x00,0x00};//default Value = 0x--0000 Rest = 18.91/Iout
  199.         
  200.   A_temp=Ampli|0x1000;
  201.         ACR_DATA[2] = (u8)A_temp;  //低位數(shù)據(jù)
  202.   ACR_DATA[1] = (u8)(A_temp>>8); //高位數(shù)據(jù)
  203.   if(Channel==0)
  204.   {
  205.                 WriteData_AD9959(CSR_ADD,1,CSR_DATA0,1);
  206.     WriteData_AD9959(ACR_ADD,3,ACR_DATA,1);
  207.         }
  208.   else if(Channel==1)
  209.   {
  210.                 WriteData_AD9959(CSR_ADD,1,CSR_DATA1,1);
  211.     WriteData_AD9959(ACR_ADD,3,ACR_DATA,1);
  212.         }
  213.   else if(Channel==2)
  214.   {
  215.           WriteData_AD9959(CSR_ADD,1,CSR_DATA2,1);
  216.     WriteData_AD9959(ACR_ADD,3,ACR_DATA,1);
  217.         }
  218.   else if(Channel==3)
  219.   {
  220.                 WriteData_AD9959(CSR_ADD,1,CSR_DATA3,1);
  221.     WriteData_AD9959(ACR_ADD,3,ACR_DATA,1);
  222.         }
  223. }
  224. /*---------------------------------------
  225. 函數(shù)功能:設(shè)置通道輸出相位
  226. Channel:  輸出通道
  227. Phase:    輸出相位,范圍:0~16383(對(duì)應(yīng)角度:0°~360°)
  228. ---------------------------------------*/
  229. void Write_Phase(u8 Channel,u16 Phase)
  230. {
  231.         u16 P_temp=0;
  232.   P_temp=(u16)Phase;
  233.         CPOW0_DATA[1]=(u8)P_temp;
  234.         CPOW0_DATA[0]=(u8)(P_temp>>8);
  235.         if(Channel==0)
  236.   {
  237.                 WriteData_AD9959(CSR_ADD,1,CSR_DATA0,1);
  238.     WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,1);
  239.   }
  240.   else if(Channel==1)
  241.   {
  242.                 WriteData_AD9959(CSR_ADD,1,CSR_DATA1,1);
  243.     WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,1);
  244.   }
  245.   else if(Channel==2)
  246.   {
  247.                 WriteData_AD9959(CSR_ADD,1,CSR_DATA2,1);
  248.     WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,1);
  249.   }
  250.   else if(Channel==3)
  251.   {
  252.                 WriteData_AD9959(CSR_ADD,1,CSR_DATA3,1);
  253.     WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,1);
  254.   }
  255. }
復(fù)制代碼
Keil5代碼下載(僅供參考):
代碼.7z (230.54 KB, 下載次數(shù): 36)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久99深爱久久99精品 | 欧美电影免费网站 | 日韩成人精品在线 | 男女视频在线观看免费 | 免费在线日韩 | 91久久看片 | 国产乱码精品一区二区三区五月婷 | 91在线视频播放 | 国产精品久久久久久久久久久久 | 国产免费一区二区 | www,黄色,com| 99av成人精品国语自产拍 | 国产精品一区二区在线 | 农夫在线精品视频免费观看 | 成人在线免费观看av | 久久综合成人精品亚洲另类欧美 | 在线观看av网站永久 | 欧美日韩在线高清 | 91porn成人精品| 午夜寂寞影院列表 | 日韩欧美手机在线 | 日韩欧美成人精品 | 视频一区在线 | 亚洲人在线观看视频 | 久久精品色欧美aⅴ一区二区 | 日日摸日日添日日躁av | 亚洲电影一级片 | 国产精品1区2区3区 欧美 中文字幕 | 久久国产精品无码网站 | 一本一道久久a久久精品综合 | 一区二区三区久久久 | 欧美区在线 | 91精品久久久久久久久久入口 | 99久久久久久99国产精品免 | 亚欧午夜| 国产精品久久久久久238 | 一区二区视频 | 伊人天堂网 | 色综合久久天天综合网 | 国产乱精品一区二区三区 | 一区二区三区四区在线视频 |