|
示波器開源啦,軟件部分已OK,下次完成硬件部分。代碼請下載附件。
IMG_20190317_171109.jpg (3.18 MB, 下載次數: 94)
下載附件
2019-3-17 17:18 上傳
Arduino示波器源程序如下:
- //################################################
- // Arduino TFT示波器
- //--------POWER Pins-----------------------
- // 5V connects to DC 5V
- // GND connects to Ground
- // 3V3 do not need to connect(NC)
- //--------LCD Display Pins-----------------
- // LCD_RD connects to Analog pin A0
- // LCD_WR connects to Analog pin A1
- // LCD_RS connects to Analog pin A2
- // LCD_CS connects to Analog pin A3
- // LCD_RST connects to Analog pin A4
- // LCD_D0 connects to digital pin 8
- // LCD_D1 connects to digital pin 9
- // LCD_D2 connects to digital pin 2
- // LCD_D3 connects to digital pin 3
- // LCD_D4 connects to digital pin 4
- // LCD_D5 connects to digital pin 5
- // LCD_D6 connects to digital pin 6
- // LCD_D7 connects to digital pin 7
- //-------SD-card fuction Pins --------------
- //This Connection Only for UNO
- //SD_SS connects to digital pin 10
- //SD_DI connects to digital pin 11
- //SD_DO connects to digital pin 12
- //SD_SCK connects to digital pin 13
- //############################################
- #include <Adafruit_GFX.h>
- #include <MCUFRIEND_kbv.h>
- MCUFRIEND_kbv tft;
- //十六進制顏色
- #define BLACK 0x0000
- #define BLUE 0x001F
- #define RED 0xF800
- #define GREEN 0x07E0
- #define CYAN 0x07FF
- #define MAGENTA 0xF81F
- #define YELLOW 0xFFE0
- #define WHITE 0xFFFF
- //RGB顏色
- #define RGB(r,g,b) (((r&0xF8)<<8)|((g&0xFC)<<3)|(b>>3))
- #define GREY RGB(127, 127, 127)
- #define DARKGREY RGB(64, 64, 64)
- #define TURQUOISE RGB(0, 128, 128)
- #define PINK RGB(255, 128, 192)
- #define OLIVE RGB(128, 128, 0)
- #define PURPLE RGB(128, 0, 128)
- #define AZURE RGB(0, 128, 255)
- #define ORANGE RGB(255,128,64)
- #define SAMPLE_X 370
- #define MAX_X 240 //點顯采樣點數
- #define DEV_WD 20 //每格20個象素
- #define view_x 275 //參數顯示x座標
- #define voltage 4.73 //參考電壓
- int input_ch1=A5; //A5
- int buf_ch1[SAMPLE_X];//通道1采樣
- int buf_x[MAX_X]; //通道1座標
- float Div_Y,V_min,V_max,V_mid,Vpp,V_rms;
- int i,i1,i2,i3,Div_X,cycle,high,duty,freq;
- unsigned long t,total;
- int adc_mode[]={4,8,16,32,64,128};
- int adc=2; //adc采樣模式(4,8,16,32,64,128)
- int hold=1;
- String kHz=" "; //KHz,MHz,Hz
- int us,count;
- int mode=1;
- int attenuation=10; //衰減模式
- //-------------------------------------------
- void setup(){
- setADC_ch(input_ch1);
- tft.reset();
- uint16_t identifier = tft.readID();
- tft.begin(identifier);
- tft.fillScreen(BLACK);
- tft.setRotation(1);
- //標題欄
- tft.fillRect(0, 0, 320, 19,BLUE);
- drawText(10,6,"Arduino Digital osc v1.0");
- //底部狀態欄
- tft.fillRect(0, 222, 320, 222,BLUE);
- //參數框
- tft.drawRect(242, 20, 78, 200, GREY);
-
- tft.setTextColor(BLUE);
- drawText(245,24,"CH1 A5");
- tft.setTextColor(RED);
- drawText(245,34,"Xdiv:");
- drawText(306,34,"us"); //單位
- drawText(245,44,"Ydiv:");
- drawText(306,44,"v"); //單位
- drawText(245,54," max:");
- drawText(306,54,"v"); //單位
- drawText(245,64," min:");
- drawText(306,64,"v"); //單位
- drawText(245,74," mid:");
- drawText(306,74,"v"); //單位
- drawText(245,84," vpp:");
- drawText(306,84,"v"); //單位
- drawText(245,94,"freq:");
- drawText(306,94,"Hz"); //頻率單位
- drawText(245,104,"duty:");
- drawText(306,104,"%"); //占空比百分號
- drawText(245,124,"ADC mode:");
- drawText(245,155,"delay us:");
-
- pinMode(input_ch1,INPUT);
-
- }
- void drawText(int16_t x, int16_t y, String text){
- tft.setCursor(x, y);
- tft.println(text);
- }
- void drawText(int16_t x, int16_t y, double text){
- tft.setCursor(x, y);
- tft.println(text);
- }
- void drawText(int16_t x, int16_t y, int text){
- tft.setCursor(x, y);
- tft.println(text);
- }
-
- void loop(){
- while(1){
- sample(); //采樣
- draw_cls(); //清除上一次的波形
- draw_Grid(); //畫網格
- measure(); //測量參數并顯示波形
- draw(WHITE); //顯示參數
- }
- }
- //ADC分頻,采樣速率
- void setP(int key) {
- switch (key){
- case 4://ADC Prescaler = 4
- //理論 Sample Rate可達16MHz/4/13=307.6KHz
- ADCSRA = _BV(ADPS1);break;
- case 8://ADC Prescaler = 8
- //理論Sample Rate可達16MHz/8/13=153.8KHz,實測93.5KH
- ADCSRA = _BV(ADPS0)|_BV(ADPS1);break;
- case 16://ADC Prescaler = 16
- //理論 Sample Rate 可達16MHz/16/13=76.8KHz
- ADCSRA = _BV(ADPS2);break;
- case 32://ADC Prescaler = 32
- //理論 Sample Rate 可達16MHz/32/13= 38.4KHz
- ADCSRA = _BV(ADPS2)|_BV(ADPS0);break;
- case 64://ADC Prescaler = 64
- //理論 Sample Rate 可達16MHz/64/13= 19.2KHz
- ADCSRA = _BV(ADPS2)|_BV(ADPS1);break;
- case 128://ADC Prescaler = 128
- //理論 Sample Rate 可達16MHz/128/13=9600Hz
- ADCSRA = _BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0);break;
- default:
- break;
- }
- ADCSRA |= _BV(ADEN);//|_BV(ADATE)|_BV(ADSC);
- }
- //ADC采樣通道
- void setADC_ch(uint16_t pin){
- switch(pin){
- case A0: //A0
- ADMUX =_BV(REFS0);break;
- case A1: //A1
- ADMUX =_BV(REFS0)|_BV(MUX0);break;
- case A2: //A2
- ADMUX =_BV(REFS0)|_BV(MUX1);break;
- case A3: //A3
- ADMUX =_BV(REFS0)|_BV(MUX0)|_BV(MUX1);break;
- case A4: //A4
- ADMUX =_BV(REFS0)|_BV(MUX2);break;
- case A5: //A5 _BV(REFS1)|
- ADMUX =_BV(REFS0)|_BV(MUX0)|_BV(MUX2);break;
- case A6: //A6
- ADMUX =_BV(REFS0)|_BV(MUX1)|_BV(MUX2);break;
- case A7: //A7
- ADMUX=_BV(REFS0)|_BV(MUX0)|_BV(MUX1)|_BV(MUX2);
- break;
- default:
- break;
- }
-
- }
- //獲取ADC采樣值
- unsigned int readADC(){
- bitClear(ADCSRA, ADIF);
- ADCSRA |= _BV(ADSC);
- loop_until_bit_is_set(ADCSRA, ADIF);
- return ADC;
- }
- //采樣
- void sample(){
- setP(adc_mode[adc]); //采樣分頻模式
- t = micros(); //CH1采樣開始時間
- //CH1 ADC采樣
- for (i=0;i<SAMPLE_X;i++){
- buf_ch1[i]=readADC();
- //采樣延時
- if(count>0){delayMicroseconds(count);}
- }
- t = (micros()-t)/SAMPLE_X; //采樣一次平均耗時
- }
- //計算參數
- void measure(){
- V_max = buf_ch1[0];V_min = buf_ch1[0];
- for (i = 1; i < MAX_X; i++){
- V_max = ((V_max<buf_ch1[i])?buf_ch1[i]:V_max);
- V_min = ((V_min>buf_ch1[i])?buf_ch1[i]:V_min);
- }
- Div_X = t*DEV_WD; //x軸每格多少us
- Div_Y = voltage/5; //Y軸每格多少mv
- V_mid = (V_max+V_min)/2; //平均值
- Vpp = (V_max-V_min); //峰峰值
-
- if(Vpp-V_mid>35){ //方波
- //周期開始點
- for (i=1; i<MAX_X;i++){
- if(buf_ch1[i]<V_mid&&buf_ch1[i+1]>V_mid)
- {i1=i;break;}
- }
- for(i=i1+1;i<MAX_X;i++){
- //周期內高電平結束點
- if(buf_ch1[i]>V_mid&&buf_ch1[i+1]<V_mid){i2=i;}
- //周期結束點
- if(buf_ch1[i]<V_mid&&buf_ch1[i+1]>V_mid)
- {i3=i;break;}
- }
-
- int a=1;
- for (i = i1; i < SAMPLE_X; i++){
- if(a<MAX_X){
- buf_x[a]=map(buf_ch1[i],0,1023,120,20);
- a++;
- }else{break;}
- }
-
- cycle=i3-i1; //周期時間=周期結速點-周期開始點
- high =i2-i1; //高電平時間=高電平結束時間-周期開始點
- duty =high*100/cycle; //占空比=高電平時間/周期時間
- freq =1000000/cycle/t; //頻率
-
- if(freq<0){freq=0;}
- //set_delay(); //自動模式
- }else{
- freq=0;duty=0;
- for (i = 1; i < SAMPLE_X; i++){
- if(i<MAX_X){
- buf_x[i]=map(buf_ch1[i],0,1023,120,20);
- }
- }
- }
- if(freq>=1000000){freq=freq/1000000;kHz="m";}
- else{kHz=" ";}
-
- }
- //自動計算采樣延時
- void set_delay(){
- if(high>DEV_WD){
- us=(high-DEV_WD)*t/MAX_X;
- count=us;
- }else if(high<DEV_WD){
- us=(DEV_WD-high)*t/MAX_X;
- count-=us;
- if(count<0){count=0;}
- }
- }
- //顯示
- void draw(uint16_t Color){
- for (i =1;i<MAX_X-1;i++) {
- tft.drawLine(i,buf_x[i],i,buf_x[i+1],WHITE);
- }
- float v=voltage/1023;
- tft.setTextColor(Color);
- drawText(view_x,34,Div_X); //X軸us每格
- drawText(view_x,44,Div_Y); //Y軸mv每格
- drawText(view_x,54,V_max*v); //最大值
- drawText(view_x,64,V_min*v); //最小值
- drawText(view_x,74,V_mid*v); //平均值
- drawText(view_x,84,Vpp*v); //落差值
- drawText(view_x,94,freq); //頻率
- drawText(300,94,kHz); //Hz,KHz,MHz
- drawText(view_x,104,duty); //占空比
-
- drawText(272,138,adc_mode[adc]); //adc采樣分頻模式
- drawText(272,170,count); //采樣延時us
-
- }
- //清除波形
- void draw_cls(){
- for (i=1;i<MAX_X-1;i++){
- tft.drawLine(i,buf_x[i],i,buf_x[i+1],BLACK);
- buf_x[i]=120;
- }
- //清除顯示的參數
- tft.fillRect(274, 32, 30, 80, DARKGREY);
- tft.fillRect(260, 134, 40, 16, DARKGREY);
- tft.fillRect(260, 165, 40, 16, DARKGREY);
- }
- //座標軸及刻度
- void draw_Grid(){
- for (int i=0; i<=MAX_X; i+=DEV_WD){
- //Y軸
- tft.drawLine(i,20,i,220,DARKGREY);
- //X軸
- if(i<=220){
- tft.drawLine(1,i+DEV_WD,MAX_X-1,i+DEV_WD,DARKGREY);}
- }
- //Y軸
- tft.drawLine(120, 20, 120, 219,RED);
- //X軸
- tft.drawLine(0, 120, MAX_X, 120,RED);
- };
復制代碼
|
-
-
TFT_view.zip
2019-3-17 17:17 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
3.24 KB, 下載次數: 240, 下載積分: 黑幣 -5
示波器代碼
評分
-
查看全部評分
|