Skip to content

Commit d2f5ec4

Browse files
committed
add DDS Unit example
1 parent 1ec94a1 commit d2f5ec4

File tree

4 files changed

+3970
-0
lines changed

4 files changed

+3970
-0
lines changed

examples/Unit/DDS_AD9833/DDSUnit.cpp

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
#include "DDSUnit.h"
2+
3+
void DDSUnit::writeDDSReg(uint8_t addr, uint8_t data)
4+
{
5+
//Serial.printf("ADDR:%02X,DATA:%02X\r\n",addr,data);
6+
_pwire->beginTransmission(DDS_UNIT_I2CADDR);
7+
_pwire->write(addr);
8+
_pwire->write(data);
9+
_pwire->endTransmission();
10+
}
11+
12+
void DDSUnit::writeDDSReg(uint8_t addr, uint8_t* data, size_t size )
13+
{
14+
_pwire->beginTransmission(DDS_UNIT_I2CADDR);
15+
_pwire->write(addr);
16+
for (size_t i = 0; i < size; i++)
17+
{
18+
_pwire->write(data[i]);
19+
}
20+
_pwire->endTransmission();
21+
}
22+
23+
uint8_t DDSUnit::readDDSReg(uint8_t addr)
24+
{
25+
uint8_t data;
26+
_pwire->beginTransmission(DDS_UNIT_I2CADDR);
27+
_pwire->write(addr);
28+
_pwire->endTransmission();
29+
_pwire->requestFrom(DDS_UNIT_I2CADDR, 1);
30+
data = _pwire->read();
31+
_pwire->endTransmission();
32+
33+
return data;
34+
}
35+
36+
void DDSUnit::readDDSRegs(uint8_t addr,uint8_t* dataptr,uint8_t size)
37+
{
38+
_pwire->beginTransmission(DDS_UNIT_I2CADDR);
39+
_pwire->write(addr);
40+
_pwire->endTransmission();
41+
_pwire->requestFrom(DDS_UNIT_I2CADDR, (int)size);
42+
for (int i = 0; i < 6; i++)
43+
{
44+
dataptr[i] = _pwire->read();
45+
}
46+
_pwire->endTransmission();
47+
}
48+
49+
int DDSUnit::begin( TwoWire *p )
50+
{
51+
_pwire = p;
52+
53+
char snStr[7];
54+
memset(snStr,0,sizeof(char)*7);
55+
readDDSRegs(DDS_DESC_ADDR,(uint8_t*)snStr,6);
56+
57+
String desc(snStr);
58+
59+
Serial.printf("sn:%s\r\n",snStr);
60+
61+
return ( desc == String("ad9833")) ? 0 : -1;
62+
}
63+
64+
void DDSUnit::setFreq( uint8_t reg ,uint64_t freq )
65+
{
66+
freq = freq * 268435456 / DDS_FMCLK;
67+
68+
uint8_t sendbuff[4] = {0,0,0,0};
69+
sendbuff[0] |= ((( freq >> 24 ) & 0xff ) | ( reg == 1 ) ? 0xC0 : 0x80 );
70+
sendbuff[1] |= (( freq >> 16 ) & 0xff );
71+
sendbuff[2] |= (( freq >> 8 ) & 0xff );
72+
sendbuff[3] |= ( freq & 0xff );
73+
writeDDSReg(DDS_FREQ_ADDR,sendbuff,4);
74+
}
75+
76+
void DDSUnit::setPhase( uint8_t reg ,uint32_t phase )
77+
{
78+
uint8_t sendbuff[2] = {0,0};
79+
phase = phase * 2048 / 360;
80+
sendbuff[0] |= ((( phase >> 8 ) & 0xff ) | (( reg == 1 ) ? 0xC0 : 0x80 ));
81+
sendbuff[1] |= ( phase & 0xff );
82+
83+
//Serial.printf("%02X %02X",sendbuff[0],sendbuff[1]);
84+
writeDDSReg(DDS_PHASE_ADDR,sendbuff,2);
85+
}
86+
87+
void DDSUnit::setFreqAndPhase( uint8_t freg, uint64_t freq, uint8_t preg, uint32_t phase )
88+
{
89+
uint8_t sendbuff[6] = {0,0,0,0,0,0};
90+
91+
freq = freq * 268435456 / DDS_FMCLK;
92+
sendbuff[0] |= ((( freq >> 24 ) & 0xff ) | ( freg == 1 ) ? 0xC0 : 0x80 );
93+
sendbuff[1] |= (( freq >> 16 ) & 0xff );
94+
sendbuff[2] |= (( freq >> 8 ) & 0xff );
95+
sendbuff[3] |= ( freq & 0xff );
96+
97+
phase = phase * 2048 / 360;
98+
sendbuff[4] |= ((( phase >> 8 ) & 0xff ) | (( preg == 1 ) ? 0xC0 : 0x80 ));
99+
sendbuff[5] |= ( phase & 0xff );
100+
101+
writeDDSReg(DDS_FREQ_ADDR,sendbuff,6);
102+
}
103+
104+
void DDSUnit::setMode( DDSmode mode )
105+
{
106+
writeDDSReg(DDS_MODE_ADDE,0x80 | mode );
107+
}
108+
109+
void DDSUnit::setCTRL(uint8_t ctrlbyte)
110+
{
111+
writeDDSReg(DDS_CTRL_ADDR,0x80 | ctrlbyte );
112+
}
113+
114+
void DDSUnit::selectFreqReg( uint8_t num )
115+
{
116+
uint8_t reg = readDDSReg(DDS_CTRL_ADDR);
117+
reg &= (~0x40);
118+
writeDDSReg(DDS_CTRL_ADDR,reg | 0x80 | ( num == 1 ) ? 0x40 : 0 );
119+
}
120+
121+
void DDSUnit::selectPhaseReg( uint8_t num )
122+
{
123+
uint8_t reg = readDDSReg(DDS_CTRL_ADDR);
124+
reg &= (~0x20);
125+
writeDDSReg(DDS_CTRL_ADDR, reg | 0x80 | ( num == 1 ) ? 0x20 : 0 );
126+
}
127+
128+
void DDSUnit::quickOUT(DDSmode mode, uint64_t freq, uint32_t phase)
129+
{
130+
if( mode <= kSQUAREMode )
131+
{
132+
setFreqAndPhase(0,freq,0,phase);
133+
}
134+
writeDDSReg( 0x20,0x80 | mode );
135+
writeDDSReg( 0x21,0x80 );
136+
}
137+
138+
void DDSUnit::OUT( uint8_t freqnum,uint8_t phasenum )
139+
{
140+
uint8_t reg = readDDSReg(DDS_CTRL_ADDR);
141+
reg &= (~0x60);
142+
writeDDSReg(DDS_CTRL_ADDR, reg | 0x80 | (( freqnum == 1 ) ? 0x40 : 0 ) | (( phasenum == 1 ) ? 0x20 : 0 ));
143+
}
144+
145+
void DDSUnit::setSleep(uint8_t level)
146+
{
147+
uint8_t reg = readDDSReg(DDS_CTRL_ADDR);
148+
reg &= (~0x18);
149+
reg |= ( level == 1 ) ? 0x10 : 0;
150+
reg |= ( level == 2 ) ? 0x08 : 0;
151+
writeDDSReg( DDS_CTRL_ADDR, 0x80 | reg );
152+
}
153+
154+
void DDSUnit::reset()
155+
{
156+
writeDDSReg(DDS_CTRL_ADDR,0x80 | 0x04 );
157+
}

examples/Unit/DDS_AD9833/DDSUnit.h

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#ifndef _DDSUNIT_H_
2+
#define _DDSUNIT_H_
3+
4+
#include "Wire.h"
5+
#include "Arduino.h"
6+
7+
#define DDS_UNIT_I2CADDR 0x31
8+
9+
#define DDS_DESC_ADDR 0x10
10+
#define DDS_MODE_ADDE 0x20
11+
#define DDS_CTRL_ADDR 0x21
12+
#define DDS_FREQ_ADDR 0x30
13+
#define DDS_PHASE_ADDR 0x34
14+
15+
#define DDS_FMCLK 10000000
16+
17+
class DDSUnit
18+
{
19+
private:
20+
TwoWire *_pwire = nullptr;
21+
void writeDDSReg(uint8_t addr, uint8_t data);
22+
void writeDDSReg(uint8_t addr, uint8_t* data, size_t size );
23+
uint8_t readDDSReg(uint8_t addr);
24+
void readDDSRegs(uint8_t addr,uint8_t* dataptr,uint8_t size);
25+
public:
26+
27+
enum DDSmode{
28+
kReservedMode = 0,
29+
kSINUSMode,
30+
kTRIANGLEMode,
31+
kSQUAREMode,
32+
kSAWTOOTHMode,//锯齿波不能调节频率相位,固定1.3k hz 0相位
33+
kDCMode,
34+
};
35+
36+
DDSUnit(){};
37+
~DDSUnit(){};
38+
int begin( TwoWire *p = &Wire1);
39+
40+
void setFreq( uint8_t reg ,uint64_t freq );
41+
void setPhase( uint8_t reg ,uint32_t phase );
42+
void setFreqAndPhase( uint8_t freg, uint64_t freq, uint8_t preg, uint32_t phase );
43+
void setMode(DDSmode mode);
44+
void setCTRL(uint8_t ctrlbyte);
45+
46+
void selectFreqReg(uint8_t num);
47+
void selectPhaseReg(uint8_t num);
48+
49+
void quickOUT(DDSmode mode, uint64_t freq, uint32_t phase);//默认0
50+
void OUT(uint8_t freqnum,uint8_t phasenum);
51+
52+
void setSleep(uint8_t level);//1/2 1模式不输出保持最后一帧电平,2关闭时钟
53+
void reset();
54+
};
55+
56+
#endif
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
#include "M5Stack.h"
2+
#include "DDSUnit.h"
3+
4+
extern const unsigned char sine[11849];
5+
extern const unsigned char square[18080];
6+
extern const unsigned char triangle[22645];
7+
extern const unsigned char sawtooth[20193];
8+
9+
DDSUnit dds;
10+
11+
int phase = 0;
12+
int freq = 10000;
13+
int modeIndex = 0;
14+
15+
String modeName[] = {
16+
"Sine",
17+
"Square",
18+
"Triangle",
19+
"Sawtooth"
20+
};
21+
22+
const unsigned char *waveIcon[] = {
23+
sine,
24+
square,
25+
triangle,
26+
sawtooth
27+
};
28+
29+
30+
void displayInfo() {
31+
M5.Lcd.fillRect(0,120,250,120,TFT_BLACK);
32+
M5.Lcd.drawJpg(waveIcon[modeIndex],sizeof(waveIcon[modeIndex]));
33+
M5.Lcd.setTextColor(TFT_GREEN);
34+
M5.Lcd.drawString("Wave: "+modeName[modeIndex],10,140);
35+
M5.Lcd.setTextColor(TFT_BLUE);
36+
M5.Lcd.drawString("Phase: "+String(phase),10,170);
37+
M5.Lcd.setTextColor(TFT_YELLOW);
38+
M5.Lcd.drawString("Freq: "+String(freq),10,200);
39+
}
40+
41+
void changeWave(int expression) {
42+
switch (expression)
43+
{
44+
case 0:
45+
dds.quickOUT(DDSUnit::kSINUSMode, freq, phase);
46+
break;
47+
case 1:
48+
dds.quickOUT(DDSUnit::kSQUAREMode, freq, phase);
49+
break;
50+
case 2:
51+
dds.quickOUT(DDSUnit::kTRIANGLEMode, freq, phase);
52+
break;
53+
case 3:
54+
//SAWTOOTH WAVE Only support 13.6Khz
55+
freq = 13600;
56+
dds.quickOUT(DDSUnit::kSAWTOOTHMode, freq, phase);
57+
break;
58+
default:
59+
break;
60+
}
61+
displayInfo();
62+
}
63+
64+
void uiInit() {
65+
M5.Lcd.fillScreen(BLACK);
66+
M5.Lcd.fillTriangle(250,200,250,230,270,215,TFT_GREEN);
67+
M5.Lcd.setTextFont(4);
68+
M5.Lcd.setTextDatum(CC_DATUM);
69+
}
70+
71+
72+
void setup()
73+
{
74+
M5.begin(true, true, true, true);
75+
uiInit();
76+
dds.begin(&Wire);
77+
changeWave(modeIndex);
78+
}
79+
80+
void loop() {
81+
82+
M5.update();
83+
if(M5.BtnA.wasPressed()){
84+
freq+=10000;
85+
changeWave(modeIndex);
86+
}
87+
if(M5.BtnB.wasPressed()){
88+
phase+=10;
89+
changeWave(modeIndex);
90+
}
91+
if( M5.BtnC.wasPressed())
92+
{
93+
if(modeIndex==3){
94+
freq=10000;
95+
}
96+
if(modeIndex<3){
97+
modeIndex++;
98+
}else{
99+
modeIndex=0;
100+
}
101+
changeWave(modeIndex);
102+
}
103+
}

0 commit comments

Comments
 (0)