나는 Arduino Nano를 발열체의 PWM 컨트롤러로 사용하고 있습니다.
현재 D11 (PB3). PWM을 사용하는 모든 핀이 사용 중이고 다시 쓰기 및 다시 배선이 필요하더라도 변경할 수 있습니다.
이것은 ~ 490Hz에서 신호를 생성하지만 이것을 다음으로 변경하는 실험을하고 싶습니다. 더 높은 주파수.
기본 64에서 제수를 변경하여 주파수를 변경할 수 있다고 생각합니다.
내 스케치는 Uses http://playground.arduino.cc/Main/SevenSegmentLibrary 및 millis () 호출-PWM 제수 변경이 이들 중 하나에 영향을 미칩니 까?
참고 setPwmFrequency
문서를 읽었지만 “정상 작동 중단”이 도움이되지 않는다고 생각합니다. 실제로 구체적인 효과에 대해 설명하고 있습니다. 저는 millis()
를 사용하여 시간이 중요하지 않은 시간 버튼을 누르고 LED를 깜박입니다.
PWM 주파수를 변경하면 Atmega의 타이머는 시간에 의존하는 많은 함수 (delay (), millis (), Servo 라이브러리)의 정상적인 작동을 방해합니다.
좀 더 연구하고 있습니다. http://playground.arduino.cc/Code/PwmFrequency 는 핀 3, 5, 6 또는 11의 변경으로 인해 delay () 및 millis ( ) 기능이 작동을 멈 춥니 다.
다른 참조에서는 3, 11이 timer 2
를 사용하므로 millis()
에 영향을 미치거나 다른 참조에 대해 timer 0
이 사용된다는 주장에 영향을주지 않습니다.
댓글
- 사용 된 PWM 타이머에 따라 예 및 아니요.
답변
이 잘못된 정보의 출처를 모르겠습니다 … 대답은 아니요 , Timer 2를 재구성해도 아니요 이러한 기능은 Timer 0에 의존하므로 millis()
또는 delay()
에 영향을 미칩니다. AFAIK는 Arduino 코어가 Timer 2를 전혀 사용하지 않습니다. 그러나 Timer 2를 사용하는 다른 Arduino 또는 타사 라이브러리가있을 수 있습니다.
여기에서 iv id = “의 소스 코드를 볼 수 있습니다. 0a067319cf “>
및 delay()
.
MITU RAJ가 대답에 올바르게 언급했듯이 핀 11의 PWM 신호는 타이머 2이므로 안전하게 사용할 수 있습니다.
댓글
- 놀이터에서 잘못된 정보를 제공합니다. .arduino.cc / Code / PwmFrequency . 나는 내가 오도 된 유일한 사용자가 아니라고 확신합니다. 다른 답변은 오해의 소지가있는 문서를 발췌 한 것입니다.
답변
답변은 아니요 , 핀 11의 PWM 분배기를 변경해도 millis()
기능 (또는 delay()
).
설명 :
Arduino Nano 는 Arduino Uno 와 동일한 ATMega328P 마이크로 컨트롤러를 사용합니다.
핀 11 “의 PWM은 타이머 2에 의해 제어됩니다. 기본적으로 타이머 2의 프리 스케일은 64입니다 (즉, 0x04 설정). 타이머 2의 기본 주파수는 31372.55Hz이며 결과적으로 490.2Hz (즉, 31372.55 / 64 = 490.1961).
다른 한편으로 마이크로 초 타이머 (즉, millis()
에서 사용하는 타이머, micros()
, delay()
및 delayMicroseconds()
)는 타이머 0에 의해 제어됩니다.
따라서 타이머 2의 프리스케일러를 변경해도 millis()
에는 영향을주지 않습니다.
그러나 핀 3의 PWM 주파수는 변경됩니다.
질문으로 돌아 가기 :
핀 11의 가능한 PWM 주파수 (488Hz 이상)는 다음과 같습니다.
31373/32 = 980.4Hz
31373/8 = 3921.6Hz
31373/1 = 31373Hz
여기서 32, 8, 1은 프리스케일러입니다.
동일 설정 값을 각각 0x03, 0x02 & 0x01로 설정합니다.
다음 코드 줄 추가 :
TCCR2B = TCCR2B & 0b11111000 | setting;
여기서 setting
는 각 프리스케일러의 설정 값입니다.
============================================ || Frequency [Hz] || Prescaler || Setting || ============================================ || 31373.55 || 1 || 0x01 || || 3921.57 || 8 || 0x02 || || 980.39 || 32 || 0x03 || || 490.20 || 64 || 0x04 || || 245.10 || 128 || 0x05 || || 122.55 || 256 || 0x06 || || 30.64 || 1024 || 0x07 || ============================================
소스 코드 : https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c
댓글
- 그냥 간단하게 선택하지만 … 위상 보정 PWM 모드에서 타이머 '의 기본 주파수는 F_CPU / 512가 아닌 F_CPU / 510 (31373Hz)입니다. 계산하는 데 255 사이클이 걸립니다. 에프 rom 0에서 255까지, 그런 다음 255를 더 추가하여 0으로 되돌립니다. C.f. 데이터 시트의 PWM 주파수 방정식입니다.
- @EdgarBonet 좋은 점입니다. 이제 답이 수정되었습니다.
- 15.31HZ까지 한 단계 더 느리게 내려갈 수 있을까요?
답변
PWM에 사용한 핀에 따라 다릅니다.
Arduino UNO / NANO 사양은 다음과 같이 말합니다.
핀 3, 9, 10 및 11의 기본 주파수는 31250Hz입니다.
핀 5 및 6의 기본 주파수는 62500Hz입니다.
사용 가능한 제수 핀 5, 6, 9 및 10은 1, 8, 64, 256 및 1024입니다.
핀 3 및 11에서 사용할 수있는 제수는 1, 8, 32, 64, 128, 256입니다. , 및 1024.
PWM 주파수는 핀 쌍으로 함께 연결됩니다. 쌍 중 하나가 변경되면 다른 하나도 일치하도록 변경됩니다.
핀 5와 6은 timer0에서 페어링됩니다.
핀 9와 10은 timer1에서 페어링됩니다.
p>
핀 3과 11은 timer2에서 쌍을 이룹니다.
핀 3, 5, 6 또는 11에서 변경하면 지연 ()이 발생할 수 있습니다. 및 millis () 함수는 작동을 중지합니다. 다른 타이밍 관련 기능도 영향을받을 수 있습니다.
댓글
- 이후 ' 사양을 인용하고 있는데 ' 링크 할 수도 있다면 좋을까요? 🙂