這是我很早之前做的,大家可以看看,附件中包含有完整的論文和源碼.
0.png (88.3 KB, 下載次數: 75)
下載附件
2017-5-3 18:23 上傳
采用基于DDS專用芯片AD9850作為信號產生模塊,并以基于ARM7的微控制器ARM1138作為整個系統的控制核心。在ARM1138中嵌入UCOSII操作系統方便實現多任務處理。例如波形轉換,頻率調節,幅值調節,12864顯示,I2C掉電保護等。本方案融合了如方案一頻率合成的優點,并能發揮ARM控制器強大的系統管理能力。同時可利于分工合作,以最快的時間完成題目的所有要求。此方案比較靈活、可擴展性好,能完全達到設計要求,故采用此方案。
ARM微控制器從鍵盤獲得控制信息,通過計算得到控制字并通過IO口送給DDS的頻率和相位的控制端口,同時,將信息顯示在LCD上。DDS輸出信號由程序控制其預置頻率和相位的正弦信號或方波信號,再通過放大倍數可調的運算放大系統來控制調幅。三角波則由方波信號經過一級方大后通過積分電路獲得。掉電保護功能則由ARM1138內部AD把數據讀回再通過I2C寫入24C04來完成。結構圖如圖2-1。
0.png (9.5 KB, 下載次數: 68)
下載附件
2017-5-3 18:21 上傳
2.2 DDS的實現設計 DDS的基本原理是利用采樣定理,通過查表法產生波形,其基本架構如圖2-2所示:
0.png (23.72 KB, 下載次數: 55)
下載附件
2017-5-3 18:22 上傳
相位累加器由N位加法器與N位累加寄存器級聯構成。 每來一個時鐘脈沖fs,加法器將頻率控制字k與累加寄存器輸出的累加相位數據相加,把相加后的結果送至累加寄存器的數據輸入端。累加寄存器將加法器在上一個時鐘脈沖作用后所產生的新相位數據反饋到加法器的輸入端,以使加法器在下一個時鐘脈沖的作用下繼續與頻率控制字相加。這樣,相位累加器在時鐘作用下,不斷對頻率控制字進行線性相位累加。 由此可以看出, 相位累加器在每一個時鐘脈沖輸入時,把頻率控制字累加一次,相位累加器輸出的數據就是合成信號的相位,相位累加器的溢出頻率就是DDS輸出的信號頻率。 用相位累加器輸出的數據作為波形存儲器(ROM)的相位取樣地址,這樣就可把存儲在波形存儲器內的波形抽樣值 (二進制編碼) 經查找表查出,完成相位到幅值轉換。波形存儲器的輸出送到D/A轉換器,D/A轉換器將數字量形式的波形幅值轉換成所要求合成頻率的模擬量形式信號。低通濾波器用于濾除不需要的取樣分量,以便輸出頻譜純凈的正弦波信號。 DDS在相對帶寬、頻率轉換時間、高分辨力、相位連續性、 正交輸出以及集成化等一系列性能指標方面遠遠超過了傳統頻率合成技術所能達到的水平,為系統提供了優于模擬信號源的性能。
0.png (158.61 KB, 下載次數: 83)
下載附件
2017-5-3 18:22 上傳
系統測試 4.1測試條件 表1 儀器儀表 儀器儀表名稱 | | | 數字示波器 | | | 函數信號發生器 | | | 直流穩壓電源 | | | 萬用表 | | |
4.2測試方案與測試結果 4.2.1觀察示波器,記錄頻率值和輸出電壓峰-峰值。 表二 頻率值和輸出電壓峰-峰值測量記錄表 預置頻率/Hz | | | | 50 | | | | 100 | | | | 500 | | | | 1k | | | | 5k | | | | 10k | | | | 15k | | | | 20k | | | |
4.2.2 觀察示波器,記錄步進頻率值。 表三 步進頻率值記錄表 預置頻率 (Hz) | | | | | 20 | | | | | 100 | | | | | 500 | | | | | 1k | | | | | 5k | | | | | 10k | | | | | 15k | | | | | 20k | | | | |
4.3測試結果分析 由實驗調試結果及測試結果,該函數信號發生器達到了題目的所有指示要求,在選擇波形與調節幅度頻率試時采用LCD人機交互界面,界面友好方便,具有直觀性。 五、結語 本次設計的低頻三相信號源,主要運用了DDS基本原理,利用ARM1138作為仿真測試和實際測量(測量結果見上表)符合題目給定的基本要求。
本次軟件設計流程如圖3-1所示:程序初始化后進入初始界面,再判斷KEY1是否被按下,按下KEY1是選擇波形型號,按下KEY2選擇頻率遞增,按下KEY3選擇頻率遞減,按下KEY4選擇幅值遞增,按下KEY5選擇幅值遞減。本設計最大的優點就是能實現掉電保護,實時保存數據,防止電壓過低或者突然斷電造成的數據丟失。
源程序:
- /******************************/
- /******************************/
- #include <includes.h>
- #include "AD9850.h"
- #define SysCtlPeriEnable SysCtlPeripheralEnable
- #define SysCtlPeriDisable SysCtlPeripheralDisable
- #define GPIOPinTypeOut GPIOPinTypeGPIOOutput
- #define TASK_STK_SIZE 64
- /**************************************
- CONSTANTS 常量
- **************************************/
- /************************************
- VARIABLES 變量
- *************************************/
- uint16 now_color=0; //當前色
- uint16 state=0,flag=0; //狀態
- uint16 frist_in=0; //初次進入標志
- unsigned char num=0,aa=1;
- unsigned int tt;
- unsigned long ulData = 0;
- unsigned char buff[5];
- unsigned char display[10];
- float temp=0;
- unsigned long dat= 0,dat2=0,dat3=0;
- unsigned char wan=0, qian=0,ge=0,shi=0,bai=0;
- unsigned char wan2=0, qian2=0,ge2=0,shi2=0,bai2=0;
- unsigned char wan3=0, qian3=0,ge3=0,shi3=0,bai3=0;
- static OS_STK GstkStart[TASK_START_STK_SIZE];//啟動任務的堆棧
- static OS_STK GstkLED[TASK_LED_STK_SIZE];
- OS_STK Task1Stk[TASK_STK_SIZE];
- OS_STK Task2Stk[TASK_STK_SIZE];
- /*************************************
- FUNCTION PROTOTYPES 函數聲明
- **************************************/
- static void taskStart (void *parg); //啟動任務
- static void taskLED(void *parg); //任務0
- void Task1(void *data);
- void Task2(void *data);
- /***********************************************
- 功能:主程序
- ************************************************/
- int main (void)
- {
- OSInit(); // OS-II 初始化uC/OS-II的內核
- OSTaskCreate( taskStart,
- (void *)0,
- &GstkStart[TASK_START_STK_SIZE-1],
- TASK_START_PRIO );
- /* 初始化啟動任務 */
- OSStart(); // 啟動uC/OS-II*/
- return(0);
- }
- /****************************************
- ** Function name: Task_Start
- ** input parameters: *p_arg
- *****************************************/
- static void taskStart (void *parg)
- {
- (void)parg;
- targetInit(); // 初始化目標單片機
- #if OS_TASK_STAT_EN > 0
- OSStatInit(); // 使能統計功能
- #endif
-
- /* 在這里創建其他任務 */
- OSTaskCreate( taskLED,
- (void *)0,
- &GstkLED[TASK_LED_STK_SIZE-1],
- TASK_LED_PRIO ); // 建處理任務
- OSTaskCreate(Task1, (void *)2, &Task1Stk[TASK_STK_SIZE - 1],2);
- OSTaskCreate(Task2, (void *)3, &Task2Stk[TASK_STK_SIZE - 1], 3);
-
-
- KEY_Init(KEY1 | KEY2); //按鍵初始化
- LCDInit(); //LCD12864初始化 // LCD初始化
- clear_all(); // 清屏
-
- while (1)
- {
- /* 啟動任務可在這里掛起 */
- OSTaskSuspend(OS_PRIO_SELF);
- }
- }
- /***********************************************
- 名稱:任務0
- 功能:
- **********************************************/
- static void taskLED(void *parg)
- {
- (void)parg;
- Display(ulData);//開機顯示
- for(;;)
- {
- if(KEY_Get(KEY1))//KEY1選波形型號
- {
- OSTimeDlyHMSM(0,0,0,150);
- if(KEY_Get(KEY1))
- {
- num++;
- if(num==4)
- {
- num=0;
- }
- }
- }
-
-
-
- if(num==1)////正弦波
- {
- LCD_ComdWrite(0x93);
- LCD_ComdWrite(0x0C);//關光標
- Displaysin();//正弦波
- dat=wan*10000+qian*1000+bai*100+shi*10;
- Write_9850(dat);
- display[4]=dat%100000/10000+0X30;//顯示千位
- display[3]=dat%10000/1000+0X30;//顯示千位
- display[2]=dat%1000/100+0X30;//顯示百位
- display[1]=dat%100/10+0X30;//顯示十位
- display[0]=dat%10+0X30;//顯示個位
- if(display[4]==0x30)
- {
- display[4]=0x20;
- if(display[3]==0x30) //高位為0,不顯示
- {
- display[3]=0x20;
- if(display[2]==0x30)//次高位為0,不顯示
- {
- display[2]=0x20;
- if(display[1]==0x30)
- display[1]=0x20;
- }
- }
- }
- LCD_ComdWrite(0x9B);
- LCD_DataWrite(display[4]);
- LCD_DataWrite(display[3]);
- LCD_DataWrite(display[2]);
- LCD_DataWrite(display[1]);
- LCD_DataWrite(display[0]);
- LCD_DataWrite('H');
- LCD_DataWrite('Z');
- if(KEY_Get(KEY2))//KEY2光標移動
- {
- OSTimeDlyHMSM(0,0,0,100);
- if(KEY_Get(KEY2))
- {
- //LCD_ComdWrite(0x9c);
- //LCD_ComdWrite(0x0F);//開光標顯示
- //LCD_DataWrite(aa+0x30);
- shi++;
- if(shi==10)
- {
- //aa=1;
- shi=0;
- bai++;
- if(bai==10)
- {
- bai=0;
- qian++;
- if(qian==10)
- {
- qian=0;
- wan++;
- if(wan==10)
- {
- wan=0;
- }
- dat=wan*10000+qian*1000+bai*100+shi*10;
- Write_9850(dat);
- }
- dat=wan*10000+qian*1000+bai*100+shi*10;
- Write_9850(dat);
- }
- dat=wan*10000+qian*1000+bai*100+shi*10;
- Write_9850(dat);
- }
-
- dat=wan*10000+qian*1000+bai*100+shi*10;
- Write_9850(dat);
-
- }
- display[4]=dat%100000/10000+0X30;//顯示千位
- display[3]=dat%10000/1000+0X30;//顯示千位
- display[2]=dat%1000/100+0X30;//顯示百位
- display[1]=dat%100/10+0X30;//顯示十位
- display[0]=dat%10+0X30;//顯示個位
- if(display[4]==0x30)
- {
- display[4]=0x20;
- if(display[3]==0x30) //高位為0,不顯示
- {
- display[3]=0x20;
- if(display[2]==0x30)//次高位為0,不顯示
- {
- display[2]=0x20;
- if(display[1]==0x30)
- display[1]=0x20;
- }
- }
- }
- LCD_ComdWrite(0x9B);
- LCD_DataWrite(display[4]);
- LCD_DataWrite(display[3]);
- LCD_DataWrite(display[2]);
- LCD_DataWrite(display[1]);
- LCD_DataWrite(display[0]);
- LCD_DataWrite('H');
- LCD_DataWrite('Z');
- }
- }////正弦波
-
-
- if(num==2)// 顯示方波
- {
- LCD_ComdWrite(0x93);
- LCD_ComdWrite(0x0C);//關光標
- Displayfang();// 顯示方波
- dat2=wan2*10000+qian2*1000+bai2*100+shi2*10;
- Write_9850(dat2);
- display[4]=dat2%100000/10000+0X30;//顯示千位
- display[3]=dat2%10000/1000+0X30;//顯示千位
- display[2]=dat2%1000/100+0X30;//顯示百位
- display[1]=dat2%100/10+0X30;//顯示十位
- display[0]=dat2%10+0X30;//顯示個位
- if(display[4]==0x30)
- {
- display[4]=0x20;
- if(display[3]==0x30) //高位為0,不顯示
- {
- display[3]=0x20;
- if(display[2]==0x30)//次高位為0,不顯示
- {
- display[2]=0x20;
- if(display[1]==0x30)
- display[1]=0x20;
- }
- }
- }
- LCD_ComdWrite(0x9B);
- LCD_DataWrite(display[4]);
- LCD_DataWrite(display[3]);
- LCD_DataWrite(display[2]);
- LCD_DataWrite(display[1]);
- LCD_DataWrite(display[0]);
- LCD_DataWrite('H');
- LCD_DataWrite('Z');
- if(KEY_Get(KEY2))//KEY2光標移動
- {
- OSTimeDlyHMSM(0,0,0,100);
- if(KEY_Get(KEY2))
- {
- //LCD_ComdWrite(0x9c);
- //LCD_ComdWrite(0x0F);//開光標顯示
- //LCD_DataWrite(aa+0x30);
- shi2++;
- if(shi2==10)
- {
- //aa=1;
- shi2=0;
- bai2++;
- if(bai2==10)
- {
- bai2=0;
- qian2++;
- if(qian2==10)
- {
- qian2=0;
- wan2++;
- if(wan2==10)
- {
- wan2=0;
- }
- dat2=wan2*10000+qian2*1000+bai2*100+shi2*10;
- Write_9850(dat2);
- }
- dat2=wan2*10000+qian2*1000+bai2*100+shi2*10;
- Write_9850(dat2);
- }
- dat2=wan2*10000+qian2*1000+bai2*100+shi2*10;
- Write_9850(dat2);
- }
-
- dat2=wan2*10000+qian2*1000+bai2*100+shi2*10;
- Write_9850(dat2);
-
- }
- display[4]=dat2%100000/10000+0X30;//顯示千位
- display[3]=dat2%10000/1000+0X30;//顯示千位
- display[2]=dat2%1000/100+0X30;//顯示百位
- display[1]=dat2%100/10+0X30;//顯示十位
- display[0]=dat2%10+0X30;//顯示個位
- if(display[4]==0x30)
- {
- display[4]=0x20;
- if(display[3]==0x30) //高位為0,不顯示
- {
- display[3]=0x20;
- if(display[2]==0x30)//次高位為0,不顯示
- {
- display[2]=0x20;
- if(display[1]==0x30)
- display[1]=0x20;
- }
- }
- }
- LCD_ComdWrite(0x9B);
- LCD_DataWrite(display[4]);
- LCD_DataWrite(display[3]);
- LCD_DataWrite(display[2]);
- LCD_DataWrite(display[1]);
- LCD_DataWrite(display[0]);
- LCD_DataWrite('H');
- LCD_DataWrite('Z');
- }
- }// 顯示方波
-
-
-
- if(num==3)// 顯示三角波
- {
- LCD_ComdWrite(0x93);
- LCD_ComdWrite(0x0C);//關光標
- Displaythree();// 顯示三角波
- dat3=wan3*10000+qian3*1000+bai3*100+shi3*10;
- Write_9850(dat3);
- display[4]=dat3%100000/10000+0X30;//顯示千位
- display[3]=dat3%10000/1000+0X30;//顯示千位
- display[2]=dat3%1000/100+0X30;//顯示百位
- display[1]=dat3%100/10+0X30;//顯示十位
- display[0]=dat3%10+0X30;//顯示個位
- if(display[4]==0x30)
- {
- display[4]=0x20;//高位為0,不顯示
- if(display[3]==0x30) //高位為0,不顯示
- {
- display[3]=0x20;
- if(display[2]==0x30)//次高位為0,不顯示
- {
- display[2]=0x20;
- if(display[1]==0x30)
- display[1]=0x20;
- }
- }
- }
- LCD_ComdWrite(0x9B);
- LCD_DataWrite(display[4]);
- LCD_DataWrite(display[3]);
- LCD_DataWrite(display[2]);
- LCD_DataWrite(display[1]);
- LCD_DataWrite(display[0]);
- LCD_DataWrite('H');
- LCD_DataWrite('Z');
- if(KEY_Get(KEY2))//KEY2光標移動
- {
- OSTimeDlyHMSM(0,0,0,100);
- if(KEY_Get(KEY2))
- {
- //LCD_ComdWrite(0x9c);
- //LCD_ComdWrite(0x0F);//開光標顯示
- //LCD_DataWrite(aa+0x30);
- shi3++;
- if(shi3==10)
- {
- shi3=0;
- bai3++;
- if(bai3==10)
- {
- bai3=0;
- qian3++;
- if(qian3==10)
- {
- qian3=0;
- wan3++;
- if(wan3==10)
- {
- wan3=0;
- }
- dat3=wan3*10000+qian3*1000+bai3*100+shi3*10;
- Write_9850(dat3);
- }
- dat3=wan3*10000+qian3*1000+bai3*100+shi3*10;
- Write_9850(dat3);
- }
- dat3=wan3*10000+qian3*1000+bai3*100+shi3*10;
- Write_9850(dat3);
- }
-
- dat3=wan3*10000+qian3*1000+bai3*100+shi3*10;
- Write_9850(dat3);
-
- }
- display[4]=dat3%100000/10000+0X30;//顯示千位
- display[3]=dat3%10000/1000+0X30;//顯示千位
- display[2]=dat3%1000/100+0X30;//顯示百位
- display[1]=dat3%100/10+0X30;//顯示十位
- display[0]=dat3%10+0X30;//顯示個位
- if(display[4]==0x30)
- {
- display[4]=0x20;
- if(display[3]==0x30) //高位為0,不顯示
- {
- display[3]=0x20;
- if(display[2]==0x30)//次高位為0,不顯示
- {
- display[2]=0x20;
- if(display[1]==0x30)
- display[1]=0x20;
- }
- }
- }
- LCD_ComdWrite(0x9B);
- LCD_DataWrite(display[4]);
- LCD_DataWrite(display[3]);
- LCD_DataWrite(display[2]);
- LCD_DataWrite(display[1]);
- LCD_DataWrite(display[0]);
- LCD_DataWrite('H');
- LCD_DataWrite('Z');
- }
- } // 顯示三角波
- }
- }
- /**********************************************************
- 名稱:Task1()
- 功能:執行相應功能
- ***********************************************************/
- void Task1(void *pdata)
- {
- pdata=pdata;
- while(1)
- {
- if(state==0)
- {
- temp=4.8;
- tt=temp*10;
- buff[0]=tt/10+0x30;
- buff[1]=tt%10+0x30;
- LCD_ComdWrite(0x8B);
- LCD_DataWrite(buff[0]);
- LCD_DataWrite('.');
- LCD_DataWrite(buff[1]);
- LCD_DataWrite('V');
- //LED_Toggle(LED1);
- state=1;
- }
- }
- }
- /****************************************
- 名稱:Task2()
- 功能:按鍵控制
- *****************************************/
- void Task2(void *pdata)
- {
- pdata=pdata;
-
- while(1)
- {
- if(flag==0)
- {
- LED_Toggle(LED3);
- flag=1;
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
下載:
函數信號發生器多任務程序(完成2 24C02).rar
(220.1 KB, 下載次數: 21)
2017-5-3 17:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
完整論文下載word格式:
函數信號發生器.doc
(340.5 KB, 下載次數: 18)
2017-5-3 17:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|