使用AD9851模块自制函数发生器
生活随笔
收集整理的這篇文章主要介紹了
使用AD9851模块自制函数发生器
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
AD9851是一款輸出最高達(dá)到70mhz的模塊,能輸出方波,正弦波兩種波形,模塊自帶濾波器輸出波形較為干凈
如果要輸出三角波建議選用AD9850
【使用Arduino來(lái)控制9851輸出波形】
功能描述:
全串口指令操作,藍(lán)牙串口可直接控制,附帶一個(gè)App用以進(jìn)行遠(yuǎn)端操作(未完成)
用一個(gè)I2C芯片轉(zhuǎn)接的1602液晶顯示當(dāng)前頻率
【使用串口傳入數(shù)據(jù)】
線路連接定義:
電位器10K,跳線跳到模塊上用于控制方波占空比
?WCLK 接 D10
?FQUP 接 D9
?REST 接 D8
?DATA 接 D7
D4,D5,D6連接下方三個(gè)按鍵
A4,A5接1602液晶I2C模塊的 SDA和SCL
串口控制指令:
w數(shù)字 指定頻率輸出
例如:w1000? 就是以1000hz輸出
r? 重置模塊
源代碼:
#include #include //包含頭文件 //#include LiquidCrystal_I2Clcd(0x27,16,2); //創(chuàng)建一個(gè)對(duì)象:lcd const int AdjustGreen = 11; const int AdjustRed = 12; const int WCLK = 10; const int FQUP = 9; const int REST = 8; const int DATA = 7; const int Button1 = 6; const int Button2 = 5; const int Button3 = 4; int DisWave = 1000;int FrequenceSaveSlot[9];//可以保存8個(gè)頻率數(shù)據(jù)void setup() {// put your setup code here, to run once:pinMode(AdjustGreen, OUTPUT);pinMode(AdjustRed, OUTPUT);pinMode(WCLK, OUTPUT);pinMode(FQUP, OUTPUT);pinMode(REST, OUTPUT);pinMode(DATA, OUTPUT);Serial.begin(9600);digitalWrite(AdjustGreen ,HIGH);lcd.init(); //lcd初始化函數(shù)lcd.backlight(); //lcd開啟背光燈函數(shù) } void lcdPrintWave() {}void ad9851_reset_serial() {digitalWrite(WCLK, LOW);digitalWrite(FQUP, LOW);//restSignaldigitalWrite(REST, LOW);digitalWrite(REST, HIGH);digitalWrite(REST, LOW);//wclkSignaldigitalWrite(WCLK, LOW);digitalWrite(WCLK, HIGH);digitalWrite(WCLK, LOW);//fqupSignaldigitalWrite(FQUP, LOW);digitalWrite(FQUP, HIGH);digitalWrite(FQUP, LOW);} //寫數(shù)據(jù) void DataJudge(unsigned char w) {if (w == 1){digitalWrite(DATA, HIGH);}else if (w == 0){digitalWrite(DATA, LOW);} } void ad9851_wr_serial(unsigned char w0, double frequence) {unsigned char i, w;long int y;double x;//計(jì)算頻率的HEX值x = 4294967295 / 180;//適合180M晶振/180為最終時(shí)鐘頻率(或30M六倍頻)//如果時(shí)鐘頻率不為180MHZ,修改該處的頻率值,單位MHz !!!frequence = frequence / 1000000;frequence = frequence * x;y = frequence;//寫w4數(shù)據(jù)w = (y >>= 0);for (i = 0; i < 8; i++){DataJudge((w>> i) & 0x01);digitalWrite(WCLK, HIGH);digitalWrite(WCLK, LOW);}//寫w3數(shù)據(jù)w = (y >> 8);for (i = 0; i < 8; i++){DataJudge((w>> i) & 0x01);digitalWrite(WCLK, HIGH);digitalWrite(WCLK, LOW);}//寫w2數(shù)據(jù)w = (y >> 16);for (i = 0; i < 8; i++){DataJudge((w>> i) & 0x01);digitalWrite(WCLK, HIGH);digitalWrite(WCLK, LOW);}//寫w1數(shù)據(jù)w = (y >> 24);for (i = 0; i < 8; i++){DataJudge((w>> i) & 0x01);digitalWrite(WCLK, HIGH);digitalWrite(WCLK, LOW);}//寫w0數(shù)據(jù)w = w0;for (i = 0; i < 8; i++){DataJudge((w>> i) & 0x01);digitalWrite(WCLK, HIGH);digitalWrite(WCLK, LOW);}//移入始能digitalWrite(FQUP, HIGH);digitalWrite(FQUP, LOW); } void Spiertest() {}void firstLoad() {ad9851_reset_serial();ad9851_wr_serial(0x01, 50000); } void loop() {// put your main code here, to runrepeatedly:String Command = {""};int inputdate = 0;int mark = 0;firstLoad();while (1){while(Serial.available() > 0){Command += char(Serial.read());delay(2);mark =1;}if(mark ==1){//Serial.println(Command);//----------調(diào)試語(yǔ)句回傳if(Command.length() > 0){for (int i = 1; i < Command.length() ; i++){if( i ==1)inputdate += (Command[i] - '0');else{inputdate = inputdate*10 + (Command[i]-'0');}DisWave = inputdate;//存儲(chǔ)用于顯示的波頻率}switch (Command[0]){case 'w':ad9851_wr_serial(0x01, inputdate);Serial.print("CurrentFrequency:");Serial.print(inputdate);Serial.println("Hz");lcd.clear();lcd.print("Current:");lcd.print(DisWave); lcd.print("Hz");break;case 'r':ad9851_reset_serial();break;default:break;}Command = String("");//Clear Commandinputdate = 0;}}mark =0;}}
如果要輸出三角波建議選用AD9850
【使用Arduino來(lái)控制9851輸出波形】
功能描述:
全串口指令操作,藍(lán)牙串口可直接控制,附帶一個(gè)App用以進(jìn)行遠(yuǎn)端操作(未完成)
用一個(gè)I2C芯片轉(zhuǎn)接的1602液晶顯示當(dāng)前頻率
【使用串口傳入數(shù)據(jù)】
線路連接定義:
電位器10K,跳線跳到模塊上用于控制方波占空比
?WCLK 接 D10
?FQUP 接 D9
?REST 接 D8
?DATA 接 D7
D4,D5,D6連接下方三個(gè)按鍵
A4,A5接1602液晶I2C模塊的 SDA和SCL
串口控制指令:
w數(shù)字 指定頻率輸出
例如:w1000? 就是以1000hz輸出
r? 重置模塊
源代碼:
#include #include //包含頭文件 //#include LiquidCrystal_I2Clcd(0x27,16,2); //創(chuàng)建一個(gè)對(duì)象:lcd const int AdjustGreen = 11; const int AdjustRed = 12; const int WCLK = 10; const int FQUP = 9; const int REST = 8; const int DATA = 7; const int Button1 = 6; const int Button2 = 5; const int Button3 = 4; int DisWave = 1000;int FrequenceSaveSlot[9];//可以保存8個(gè)頻率數(shù)據(jù)void setup() {// put your setup code here, to run once:pinMode(AdjustGreen, OUTPUT);pinMode(AdjustRed, OUTPUT);pinMode(WCLK, OUTPUT);pinMode(FQUP, OUTPUT);pinMode(REST, OUTPUT);pinMode(DATA, OUTPUT);Serial.begin(9600);digitalWrite(AdjustGreen ,HIGH);lcd.init(); //lcd初始化函數(shù)lcd.backlight(); //lcd開啟背光燈函數(shù) } void lcdPrintWave() {}void ad9851_reset_serial() {digitalWrite(WCLK, LOW);digitalWrite(FQUP, LOW);//restSignaldigitalWrite(REST, LOW);digitalWrite(REST, HIGH);digitalWrite(REST, LOW);//wclkSignaldigitalWrite(WCLK, LOW);digitalWrite(WCLK, HIGH);digitalWrite(WCLK, LOW);//fqupSignaldigitalWrite(FQUP, LOW);digitalWrite(FQUP, HIGH);digitalWrite(FQUP, LOW);} //寫數(shù)據(jù) void DataJudge(unsigned char w) {if (w == 1){digitalWrite(DATA, HIGH);}else if (w == 0){digitalWrite(DATA, LOW);} } void ad9851_wr_serial(unsigned char w0, double frequence) {unsigned char i, w;long int y;double x;//計(jì)算頻率的HEX值x = 4294967295 / 180;//適合180M晶振/180為最終時(shí)鐘頻率(或30M六倍頻)//如果時(shí)鐘頻率不為180MHZ,修改該處的頻率值,單位MHz !!!frequence = frequence / 1000000;frequence = frequence * x;y = frequence;//寫w4數(shù)據(jù)w = (y >>= 0);for (i = 0; i < 8; i++){DataJudge((w>> i) & 0x01);digitalWrite(WCLK, HIGH);digitalWrite(WCLK, LOW);}//寫w3數(shù)據(jù)w = (y >> 8);for (i = 0; i < 8; i++){DataJudge((w>> i) & 0x01);digitalWrite(WCLK, HIGH);digitalWrite(WCLK, LOW);}//寫w2數(shù)據(jù)w = (y >> 16);for (i = 0; i < 8; i++){DataJudge((w>> i) & 0x01);digitalWrite(WCLK, HIGH);digitalWrite(WCLK, LOW);}//寫w1數(shù)據(jù)w = (y >> 24);for (i = 0; i < 8; i++){DataJudge((w>> i) & 0x01);digitalWrite(WCLK, HIGH);digitalWrite(WCLK, LOW);}//寫w0數(shù)據(jù)w = w0;for (i = 0; i < 8; i++){DataJudge((w>> i) & 0x01);digitalWrite(WCLK, HIGH);digitalWrite(WCLK, LOW);}//移入始能digitalWrite(FQUP, HIGH);digitalWrite(FQUP, LOW); } void Spiertest() {}void firstLoad() {ad9851_reset_serial();ad9851_wr_serial(0x01, 50000); } void loop() {// put your main code here, to runrepeatedly:String Command = {""};int inputdate = 0;int mark = 0;firstLoad();while (1){while(Serial.available() > 0){Command += char(Serial.read());delay(2);mark =1;}if(mark ==1){//Serial.println(Command);//----------調(diào)試語(yǔ)句回傳if(Command.length() > 0){for (int i = 1; i < Command.length() ; i++){if( i ==1)inputdate += (Command[i] - '0');else{inputdate = inputdate*10 + (Command[i]-'0');}DisWave = inputdate;//存儲(chǔ)用于顯示的波頻率}switch (Command[0]){case 'w':ad9851_wr_serial(0x01, inputdate);Serial.print("CurrentFrequency:");Serial.print(inputdate);Serial.println("Hz");lcd.clear();lcd.print("Current:");lcd.print(DisWave); lcd.print("Hz");break;case 'r':ad9851_reset_serial();break;default:break;}Command = String("");//Clear Commandinputdate = 0;}}mark =0;}}
總結(jié)
以上是生活随笔為你收集整理的使用AD9851模块自制函数发生器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 年轻人,如何抗造系列之 - 感恩,树洞及
- 下一篇: phpstorm10.0.0破解(10.