Pages: 1 [2]   Go Down
Author Topic: PWM In, Pulse Out  (Read 981 times)
0 Members and 1 Guest are viewing this topic.
Austria
Offline Offline
Full Member
***
Karma: 2
Posts: 107
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ein Rechtecksignal kannst du mithilfe von Interrupts machen.
Bei jedem Interrupt musst du dann den Zustand vom Pin ändern.

Code:
ISR (TIMER2_COMPA_vect)
{
  PORTB ^= (0x01 << 3); // Pin 3 am PORTB toggelt seinen Zustand bei jedem Interrupt
}

Den Timer musst du abhängig von deinem PPM-Signal konfigurieren. Zu beachten ist dass, das Rechteck-Signal die halbe Frequenz von der Interrupt-Frequenz hat.

Falls du einen UNO hast, kannst du hier lernen wie man die Timer konfiguriert.
https://sites.google.com/site/qeewiki/books/avr-guide/timers-on-the-atmega328

Grüße,
J3RE
Logged

Cologne
Offline Offline
Sr. Member
****
Karma: 7
Posts: 474
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
hier mal ein Beispiel, wie man einen 16Bit Timer beim Arduino Mega dazu nutzen kann einen 56kHz Rechteck zu erzeugen.
Code:
// Testprog zur Ansteuerung der Counter Register des Arduino Mega
// ich nutze OC5B an Mega2560 Chip Pin39 (PL4) - dieser Pin geht auf Arduino Mega Pin45

#define PIN_IR 45

void setup() {
  pinMode(PIN_IR, OUTPUT);

  // WGM53:0 = 0100  WGM53 WGM52 WGM51 WFGM50
  // COM5A1:0 = 01   COM5A1 COM5A0
  // CS50 = 1 - no prescaling 16MHz
  // TCCR5A -  COM5A1 COM5A0 COM5B1 COM5B0 COM5C1 COM5C0 WGM51 WGM50
  // TCCR5B -  ICNC5  ICES5  xxxx   WGM53  WGM52  CS52   CS51  CS50

  TCCR5A = 0;
  TCCR5B = 0; 
  TCCR5A = B00010000;
  TCCR5B = B00001001; //no prescalering   WGM53  WWGM52  CS50
  OCR5A = 142; //count to 287 (16MHz/2*(1+142)=56 kHz)
}

void loop() {
}
Logged

Pages: 1 [2]   Go Up
Jump to: