|
示波器开源啦,软件部分已OK,下次完成硬件部分。代码请下载附件。
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);
- };
复制代码
|
评分
-
查看全部评分
|