kramann.info
© Guido Kramann

Login: Passwort:










1.7 Umsetzung des Basiskonzepts

  • Das Basiskonzept soll hier exemplarisch umgesetzt werden für eine Klasse PWMtimer1, die die beiden PWM-Ausgänge des Timers 1 verwendet.
  • Im Hauptprogramm wird die Klasse dazu benutzt, einen Sägezahnförmigen Verlauf des PWM-Signals auf Pin 18 zu erzeugen.
  • Es werden die Klasse RS232 und PinWatchdog mit verwendet, von denen hier nur die verfügbaren Methoden als UML-Diagramm gezeigt werden.
  • In den Objekten vom Typ PWMtimer1 werden Zeiger der Objekte von RS232 und PinWatchdog gespeichert/registriert, um auf deren Methoden Zugriff zu haben.
  • Bei start() werden die notwendigen Register so konfiguriert, dass der Timer 1 PWM-Signale an die Pins 18 und 19 senden kann.
  • Mit stop() werden die Register wieder zurückgesetzt und die Pins freigegeben.
#include<avr/io.h>

using namespace std;

#include "RS232.h"
#include "PinWatchdog.h"
#include "PWMtimer1.h"

#define TAKTFREQUENZ 9216000
#define BAUDRATE 115200

int main(void)
{
    RS232 rs232(TAKTFREQUENZ,BAUDRATE);
    PinWatchdog pindog(&rs232);

//    PWMtimer1 pwm1(0,0);
    PWMtimer1 pwm1(&rs232,&pindog);
    pwm1.start();
    unsigned char akku = 0;
    unsigned long int pause;
    while(true)
    {
        
        pwm1.setzePulsbreitePin18(akku);
        akku++;
        for(pause=0;pause<10000;pause++);
    }
    return 0;
}
 

Code 1.7-1: Hauptprogramm muecb.c

class PWMtimer1
{
    private:
        RS232* rs232;
        PinWatchdog* pindog;

    public: 
        PWMtimer1(RS232* rs232, PinWatchdog* pindog)
	{
          this->rs232 = rs232;
          this->pindog = pindog;

          //Nachricht an PC senden
          if(rs232!=0)
          {
		    rs232->sendeText("\n\rInstanz der Klasse *PWMtimer1* gebildet\n\r");
		    rs232->sendeText("\n\r***** PWM Timer 1 *****\n\r");
		    rs232->sendeText("AVR-Konfiguration fuer ATmega32:\n\r");
		    rs232->sendeText("Betroffene Pins: 18 (PD4/OC1B) 19 (PD5/OC1A) \n\r");
		    rs232->sendeText("Betroffene Register: TCCR1A TCCR1B\n\r");
		    rs232->sendeText("Bezeichnung: Timer1 auf 8 Bit Phase Correct PWM-Mode mit Taktteilung 1\n\r");
		    rs232->sendeText("Pulsbreite Pin 18 und 19 kann getrennt eingestellt werden.\n\r");
		    rs232->sendeText("Methoden:\n\r");
		    rs232->sendeText("setzePulsbreitePin18(unsigned char) \n\r");
		    rs232->sendeText("setzePulsbreitePin19(unsigned char) \n\r");
          }

        }

        void setzePulsbreitePin18(unsigned char breite)
        {
            OCR1B = breite;
        }

        void setzePulsbreitePin19(unsigned char breite)
        {
            OCR1A = breite;
        }

        void start()
        {
            if(rs232!=0)
            {
                rs232->sendeText("\n\rSTART ***** PWMtimer1 ***** \n\r");
            }
            //merken, welche Pins benutzt werden
            if(pindog!=0)
            {
                pindog->sperrePin(18);
                pindog->sperrePin(19);
            }
            //TCC1A
            //Bit:  7       6       5       4	
	        //Bez.: COM1A1, COM1A0, COM1B1, COM1B0
            //legt PWM-Mode fest 

            //Bit:  3       2       
	        //Bez.: FOC1A   FOC1B
            //müssen 0 sein in PWM-Mode

	        //Bit:  1       0
	        //Bez.: WGM11   WGM10
            //für 8-Bit phasen korrektem PWM:
	        //Bel.: 0       1      
	        TCCR1A = 0b10100001;

	        //Bit:  2       1     0
	        //Bez.: CS12    CS11  CS10
	        //Teilung des Taktes: 001 /1  010 /8 011 /64 100 /256
	        //Bel.: 0       1     1
            TCCR1B = 0b00000001;

            DDRD |= (1<<PD4) | (1<<PD5); //auf Ausgang setzen.

            OCR1B = 0;
            OCR1A = 0;
        }

        void stop()
        {
            if(rs232!=0)
            {
                rs232->sendeText("\n\rSTOP ***** PWMtimer1 ***** \n\r");
            }
            //Pins wieder freigeben
            if(pindog!=0)
            {
                pindog->entsperrePin(18);
                pindog->entsperrePin(19);
            }

	    TCCR1A = 0b00000000;
            TCCR1B = 0b00000000;
            PORTD &= 255 - ((1<<PD4) | (1<<PD5)); //sicherheitshalber auf Low setzen.
        }
};
 

Code 1.7-2: Klasse PWMtimer1 in File PWMtimer1.h

BILDBESCHREIBUNG

Bild 1.7-1: Klasse RS232 in File RS232.h als UML-Klassendiagramm.

BILDBESCHREIBUNG

Bild 1.7-1: Klasse PinWatchdog in File PinWatchdog.h als UML-Klassendiagramm.

Download des gesamten Beispielprojekts

test1_sensor_und_rs232.zip: Neues Projekt mit AD-Wandler und Ausgabe auf RS232 über muecA (nicht Basiskonzept-Kompatibel)

test2_pwmmotor_und_rs232muecA.zip: Neues Projekt mit PWM-Signalen über Timer1, Motoransteuerung und Ausgabe auf RS232 über muecB, Basiskonzept-Kompatibel!