아두이노 > Arduino Waveform Generator

TODAY721 TOTAL673,262
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 아두이노 | 아두이노 | Arduino Waveform Generator

페이지 정보

작성자 키트 작성일2017-09-13 13:51 조회901회 댓글0건

본문

 


 
//wavetype storage:
//0 is pulse
//1 is triangle
//2 is saw
//3 is sine
byte type=0,i,typecurrent=8,typelast,typecounter[4],PWTolerance=8,freqTolerance=2;
int pulseWidthScaled,PWCurrent,frequency,freqCurrent;
unsigned int freqscaled;
long t,samplerate,period;
float pulseWidth;
 
//storage variables- I used these to cut down on the math being performed during the interrupt
byte wave,sawInc,triInc;
int sawByte=0,triByte=0,sinNum=0,sinInc;
//
void setup(){
  DDRD=0xFF; DDRB=0xFF;
  OCR1A=159; TCCR1B=(1<<WGM12)||(1<<CS10); TIMSK1|=(1<<OCIE1A); // 16000000/1/(159+1)=100KHz
  samplerate=100000;
  PORTB=1<<type;
  //initialize variables
  frequency=analogRead(A5);  // initialize frequency
  freqscaled=48*frequency+1// from 1 to ~50,000\
  period=samplerate/freqscaled;
  pulseWidth=analogRead(A4); // initalize pulse width
  pulseWidthScaled=int(pulseWidth/1023*period);
  triInc=511/period;
  sawInc=255/period;
  sinInc=20000/period;
  sei();
}
//
void checkFreq(){
  freqCurrent=analogRead(A5);
  if(abs(freqCurrent-frequency)>freqTolerance){ // if reading from pot exceeds tolerance
    frequency=freqCurrent;                      // new frequency- number between 0 and 1024
    freqscaled=48*frequency+1;                  // from 1 to ~50,000
    period=samplerate/freqscaled;
    pulseWidthScaled=int(pulseWidth/1023*period);
    triInc=511/period; if(triInc==0)triInc=1;
    sawInc=255/period; if(sawInc==0)sawInc=1;
    sinInc=20000/period;
  }
}
//
void checkPW(){
  PWCurrent=analogRead(A4);
  if(abs(PWCurrent-pulseWidth)>PWTolerance){ // if reading from pot exceeds tolerance
    pulseWidth=PWCurrent;                    // new pulse width,val between 0 and 1023
    pulseWidthScaled=int(pulseWidth/1023*period);
  }
}
//
void checkShape(){//debounce and check states of buttons
  //  4 momentary switches control waveshape
  //   -pulse connects to A0
  //   -triangle A1
  //   -saw A2
  //   -sine A3
  typelast=typecurrent;
  if     (digitalRead(A0)==LOW){ typecurrent=1;}
  else if(digitalRead(A1)==LOW){ typecurrent=2;}
  else if(digitalRead(A2)==LOW){ typecurrent=4;}
  else if(digitalRead(A3)==LOW){ typecurrent=8;}
  //
  for(i=0;i<4;i++){
    if(i==type){}
    else{
      if((typecurrent&(1<<i))^(typelast&(1<<i))){  // current diff than prev and debounce
        if((typecurrent&(1<<i)))type=i;            // currently depressed//set wave type
        else                    typecounter[i]=12// else set debounce counter to 12
      }
      else if(((typecurrent&(1<<i))==(typelast&(1<<i )))){ // if current same as prev and diff than debounce
        if(typecounter[i]>0&&--typecounter[i]==0){         // decrease debounce counter and check to see if=0
          if((typecurrent&(1<<i)))type=i;                  // if debounce counter=0 toggle debounced state
        }
      }
    }
  }
}
//
ISR(TIMER1_COMPA_vect){ //timer 1 interrupt
  if(++t>=period)t=0;
  switch(type){
    case 0if(pulseWidthScaled<=t)wave=255else wave=0break//pulse
    case 1//triangle
        if((period-t)>t){
          if(t==0)triByte=0else triByte+=triInc;
        } 
        else triByte-=triInc;
        //
        if(triByte>255)triByte=255else if(triByte<0)triByte=0;
        wave=triByte; break;
    case 2if(t=0)sawByte=0else sawByte+=sawInc; wave=sawByte;        break//saw
    case 3: sinNum=t*sinInc;  wave=pgm_read_byte_near(sine20000+sinNum); break//sine
  }
  PORTD=wave;
}
//
void loop(){
  checkFreq();
  checkShape();
  checkPW();
  PORTB=1<<type;
}
cs


1949137565_zTxQSlcm_F8002POH9T4R08A.LARGE.jpg
1949137565_IQWXNPM1_2367BC3F532161AD1D43E7

코드가 AVRstudio 스타일로 작성 되어 있습니다.


ISR(TIMER1_COMPA_vect){ //timer 1 interrupt
  if(++t>=period)t=0;
  switch(type){
    case 0if(pulseWidthScaled<=t)wave=255else wave=0break//pulse
    case 1//triangle
        if((period-t)>t){
          if(t==0)triByte=0else triByte+=triInc;
        } 
        else triByte-=triInc;
        //
        if(triByte>255)triByte=255else if(triByte<0)triByte=0;
        wave=triByte; break;
    case 2if(t=0)sawByte=0else sawByte+=sawInc; wave=sawByte;        break//saw
    case 3: sinNum=t*sinInc;  wave=pgm_read_byte_near(sine20000+sinNum); break//sine
  }
  PORTD=wave;
}
사인파를 제외하면 규칙적으로 변하는 파형이니 크게 어려운 것이 없고

어려운 사인파는 만들어둔 사인값 테이블을 불러서 포트D에 출력합니다. 

댓글 0

조회수 901

등록된 댓글이 없습니다.

아두이노HOME > 아두이노 > 전체 목록

아두이노 목록
제목 작성자 작성일 조회
62 아두이노 Adafruit Motor/Stepper/Servo Shield for Arduino kit - v1.2 이미지 키트 17-09-13 1168
61 아두이노 가스센서 이미지 키트 17-09-13 1120
현재글 아두이노 Arduino Waveform Generator 이미지 키트 17-09-13 902
59 아두이노 Arduino Waveform Generator 키트 17-09-13 890
58 아두이노 Arduino Waveform Generator 이미지 키트 17-09-13 1120
57 아두이노 Exclusive 2.5 GHz Frequency Counter 이미지 키트 17-09-13 2353
56 아두이노 AVR SIMULATOR IDE 이미지 키트 17-09-13 782
55 아두이노 Marlin 이미지 키트 17-09-13 844
54 아두이노 opencircuits.com - Oscilloscope 이미지 키트 17-09-13 876
53 아두이노 Zorkduino 키트 17-09-13 846
52 아두이노 Single Chip AVR BASIC Computer V0.1 키트 17-09-13 895
51 아두이노 Single Chip AVR BASIC Computer V0.3 키트 17-09-13 915
50 아두이노 Single Chip AVR BASIC Computer 키트 17-09-13 821
49 아두이노 Single Chip Computer: Easy to produce AVR BASIC Computer 이미지 키트 17-09-13 908
48 아두이노 Arduino Realtime Audio Processing 이미지 키트 17-09-13 829
게시물 검색

2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2017
모바일버전으로보기