2016-05-31 4 views
0

Arduino Due PWM을 기본 해상도보다 더 높은 해상도와 주파수로 사용할 수 있기를 원합니다. 저는 IDE 1.6.8을 사용합니다. 몇 주 전에 설치했을 때 가장 최근이었습니다. (1.6.9가 지금 진행 중일 것 같습니다). 인터넷에서 검색하고 보드 및 오실로스코프 실험 후, 나는 다음과 같은 결론을 얻었다 :Arduino Due PWM

  • 높은 PWM 주파수를 얻기 위해, 하나는 variant.h에 해당하는 라인을 수정할 수 있습니다. PWM은 9 핀에 포함 된 핀 6에 영향을 미친 것으로 보이고, TC는 다른 PWM 인 에이블 핀이다. 나는 그것이 핀이 어느 타이머에 있기 때문에 그것이다고 생각 하느냐?

#define PWM_FREQUENCY 20000 // changed from 1000 #define TC_FREQUENCY 20000 // changed from 1000

  • 바와 같이의 analogWriteResolution() 아두 이노 기능이 파괴되어 여러 곳에서 말했다 : 그것은 마이크로(), 밀리() 등이 변경에 의해 영향을받지 않습니다 보인다 , 또는 당연히 만기 PWM 해상도를 증가시키는 것만으로는 충분하지 않습니다. 예상대로 analogWriteResolution를 들어() 일, 하나는 variant.h 다음 사항을 수정해야 :

#define PWM_MAX_DUTY_CYCLE 4095 // changed from 255 #define PWM_MIN_DUTY_CYCLE 0 #define PWM_RESOLUTION 12 // changed from 8

  • 보인다 그 아두 이노 인해 R3의 물리적 라벨 보드를 구입했을 때 표준 인 -E는 보드에 쓰여졌습니다 DIGITAL (PWM ~)이고 ~은 핀 3, 5, 6, 9, 10, 11에만 있습니다. while 나는 모든 핀 2에 PWM을 포함시킬 수있다. 포함.

모든 내용을 파악하고 오실로스코프 등을 확인하는 데 시간이 걸렸으므로이 내용을 게시합니다.이 질문은 stackoverflow에서 찾을 수 없습니다. 또한 두 가지 질문이 있습니다 :

  • PWM과 TC 주파수를 수정하는 것은 괜찮습니까? 다른 핵심 함수/라이브러리와 상호 작용할 수 있습니까?

  • 역 호환성 이외의 PWM 최대 듀티 사이클 및 해상도의 기본값은 이유가 있습니까?

답변

1
당신은 PWM 주파수 제수하여이 작업을 수행 할 수

:

이는 PWMfrequency 라이브러리에 구현됩니다

void setPwmFrequency(int pin, int divisor) { 
    byte mode; 
    if(pin == 5 || pin == 6 || pin == 9 || pin == 10) { 
    switch(divisor) { 
     case 1: mode = 0x01; break; 
     case 8: mode = 0x02; break; 
     case 64: mode = 0x03; break; 
     case 256: mode = 0x04; break; 
     case 1024: mode = 0x05; break; 
     default: return; 
    } 
    if(pin == 5 || pin == 6) { 
     TCCR0B = TCCR0B & 0b11111000 | mode; 
    } else { 
     TCCR1B = TCCR1B & 0b11111000 | mode; 
    } 
    } else if(pin == 3 || pin == 11) { 
    switch(divisor) { 
     case 1: mode = 0x01; break; 
     case 8: mode = 0x02; break; 
     case 32: mode = 0x03; break; 
     case 64: mode = 0x04; break; 
     case 128: mode = 0x05; break; 
     case 256: mode = 0x06; break; 
     case 1024: mode = 0x07; break; 
     default: return; 
    } 
    TCCR2B = TCCR2B & 0b11111000 | mode; 
    } 
} 
: 기본적으로 다음과 같습니다 http://playground.arduino.cc/Code/PwmFrequency