From 2542f17c3a5dd2fd418b52df2593b908355f6555 Mon Sep 17 00:00:00 2001 From: Yves Ehrlich Date: Wed, 5 Feb 2020 13:38:23 +0100 Subject: [PATCH] Motortreiber Lib added --- .~lock.ideen_mechanik_und_elektronik.odt# | 2 +- Code/libraries/L298N/L298N.cpp | 57 ++++++++++++++++++++++ Code/libraries/L298N/L298N.h | 28 +++++++++++ Code/libraries/L298N/keywords.txt | 22 +++++++++ Code/miniRobot/miniRobot.ino | 4 +- ideen_mechanik_und_elektronik.odt | Bin 23930 -> 24755 bytes 6 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 Code/libraries/L298N/L298N.cpp create mode 100644 Code/libraries/L298N/L298N.h create mode 100644 Code/libraries/L298N/keywords.txt diff --git a/.~lock.ideen_mechanik_und_elektronik.odt# b/.~lock.ideen_mechanik_und_elektronik.odt# index 1bf393e..affc95a 100644 --- a/.~lock.ideen_mechanik_und_elektronik.odt# +++ b/.~lock.ideen_mechanik_und_elektronik.odt# @@ -1 +1 @@ -,yves,yves-UB,03.02.2020 23:03,file:///home/yves/.config/libreoffice/4; \ No newline at end of file +,yves,yves-UB,05.02.2020 13:15,file:///home/yves/.config/libreoffice/4; \ No newline at end of file diff --git a/Code/libraries/L298N/L298N.cpp b/Code/libraries/L298N/L298N.cpp new file mode 100644 index 0000000..fbe6818 --- /dev/null +++ b/Code/libraries/L298N/L298N.cpp @@ -0,0 +1,57 @@ +#include "L298N.h" + + L298N::L298N() { + DDR_A |= PIN_A; + PORT_A &= ~PIN_A; + DDR_B |= PIN_B; + PORT_B &= ~PIN_B; + + DDRB |= 6; //set OC1A and OC1B as output + PORTB &= ~6; //clear OC1A and OC1B + + // + TCCR1A = 0; // set TCCRXA register to 0 + TCCR1B = 0; // set TCCRXB register to 0 + TCNT1 = 0; // reset counter value + + //OC1B behaviour + TCCR1A |= (1 << COM1B1); + //OCC1A behaviour + TCCR1A |= (1 << COM1A1); + TCCR1A |= (1 << WGM10); + + // 1:1, 62.5kHz + TCCR1B |= (1 << CS10); + + TCCR1B |= (1 << WGM12); + //enable timer + TIMSK1 = 0; //no Interrupts + } + L298N::setPWM_A(int16_t pwmA) { + if(pwmA < 0) { + PWMA = 0xFF + pwmA; + PORT_A |= PIN_A; + } else { + if(pwmA == 0) { + PWMA = 0; + PORT_A &= ~PIN_A; + } else { + PWMA = pwmA; + PORT_A &= ~PIN_A; + } + } + } + L298N::setPWM_B(int16_t pwmB) { + if(pwmB < 0) { + PWMB = 0xFF + pwmB; + PORT_B |= PIN_B; + } else { + if(pwmB == 0) { + PWMB = 0; + PORT_B &= ~PIN_B; + } else { + PWMB = pwmB; + PORT_B &= ~PIN_B; + } + } + } diff --git a/Code/libraries/L298N/L298N.h b/Code/libraries/L298N/L298N.h new file mode 100644 index 0000000..883f66c --- /dev/null +++ b/Code/libraries/L298N/L298N.h @@ -0,0 +1,28 @@ +#pragma once + +#ifndef L298N_h +#define L298N_h + +#include + +#define PIN_A 0x01 +#define PORT_A PORTB +#define DDR_A DDRB +#define PIN_B 128 +#define PORT_B PORTD +#define DDR_B DDRD + +#define PWMA OCR1B +#define PWMB OCR1A + +class L298N { + public: + L298N(); + setPWM_A(int16_t pwmA); + setPWM_B(int16_t pwmB); + + //private: + +}; + +#endif diff --git a/Code/libraries/L298N/keywords.txt b/Code/libraries/L298N/keywords.txt new file mode 100644 index 0000000..33bae47 --- /dev/null +++ b/Code/libraries/L298N/keywords.txt @@ -0,0 +1,22 @@ +######################################### +# Syntax Coloring Map For L298N Library +######################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +L298N KEYWORD1 + + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +setPWMA KEYWORD2 +setPWMB KEYWORD2 + + +####################################### +# Constants (LITERAL1) +####################################### diff --git a/Code/miniRobot/miniRobot.ino b/Code/miniRobot/miniRobot.ino index c05a9f1..bcb2398 100644 --- a/Code/miniRobot/miniRobot.ino +++ b/Code/miniRobot/miniRobot.ino @@ -37,14 +37,14 @@ const byte address[6] = "00001"; #include #define BEEP 14 - +/* #define PWM_PINA 10 #define PINA 8 #define PWM_PINB 9 #define PINB 7 #define NUMPWM 1 -#define RESOLUTION 255 +#define RESOLUTION 255 */ //MX1508 motorA(PWM_PINA,PINA, FAST_DECAY, NUMPWM); //MX1508 motorB(PWM_PINB,PINB, FAST_DECAY, NUMPWM); diff --git a/ideen_mechanik_und_elektronik.odt b/ideen_mechanik_und_elektronik.odt index 8970564599029454522800c3e0ee8007bbe4439f..dd56f823822177fb17c31c6d4197bc69fbbff4a7 100644 GIT binary patch delta 10077 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