PWM met Mega2650

Hardware geleverd door Arduino
Berichten: 25
Geregistreerd: 24 Jan 2018, 17:03

PWM met Mega2650

Berichtdoor Est29 » 14 Feb 2021, 17:50

In een systeempje wil ik een servomotortje en een motor met H-brug aansturen.
Beide onderdelen heb ik van te voren apart gebouwd en getest. Werken prima.
Bij de integratie gaat het fout.
Procesor Mega 2650 R3.
#include <Servo.h>
Servo aangesloten op pin 9. servo.attach(9).
H-motor met H-brug aangesloten op pin 8(PWM). Enable van de brug met AnalogWrite(pin 8, 100);
Beide onderdelen werken afzonderlijk prima. Maar niet samen.
Als de servo "aan" staat (servo.attach(9)) en de loop komt bij de H-motor stopt de loop. Zet ik de servo uit (//servo.attach(9)) dan blijft het programma lopen en werkt de H-motor prima.
Het lijkt er op dat deze twee onderdelen elkaar in de weg zitten.
Met een Mega2650 heb je 15 PWM-output tot je beschikking en je kunt wel 24 servo's aansturen. Maar niet bij mij.
Wat zie ik over het hoofd?
EST29

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: PWM met Mega2650

Berichtdoor shooter » 14 Feb 2021, 18:02

allereerst een H brug heeft 2 of meer aansluitingen, de Enable ingang is vaak de PWM ingang en zou dus met attach aangesloten moeten worden, vaak is de richting een andere ingang en soms de bruggen apart maar dat ligt heel erg aan het gebruikte IC.
je moet voor elke servo dus wel een servo aanroepen met een andere pin nummer.
Een servo motor is iets heel anders en werkt met een tijdmodule, en draait dan van 0 tot 270 graden bijvoorbeeld,
Ik zou zeggen zet hier even je listing neer dan kijken we even.
paul deelen
shooter@home.nl

Berichten: 25
Geregistreerd: 24 Jan 2018, 17:03

Re: PWM met Mega2650

Berichtdoor Est29 » 15 Feb 2021, 10:55

De H-brug is een L293D. Deze heeft twee controlepinnen (voor voor- en achteruit) en een enablePin voor PWM.
Deze motorsturing werkt prima, totdat de servo aanstaat.

/*1-02-2021 EST29
SAM_1.0 is samenvoeging van:
-Test_motorDriver_1.0
-Test_Bediening_1.0
Lowbite: Led's : L1, L2, L3, L4, L5, L6, L7, L8
wit, geel, rood, blauw, blauw, rood, geel, wit.
Highbite: Switch: S1, S2, S3, S4, S5, S6, S7, S8.
-Test_Stuurmoter_1.0
-Test_ODO-interrupt_1,0
-Test_Loopconter_1.0
_Test_FrontDisplay's_1.0
*/

//Declaratie---------------------------------------------------
#include <Wire.h>
#include <Servo.h>
#include <Arduino.h>
#include <U8g2lib.h>
#include "SparkFun_VL53L1X.h"
#include <SparkFun_I2C_Mux_Arduino_Library.h>
QWIICMUX myMux;

U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);

//Bediening
//address is |0100|A0|A1|A2|
int address = 0x22; //mbv addressTest
uint16_t dataReceive; //16bit data received
uint16_t dataSend; //16bit data sent
uint8_t hi=0; //highByte
uint8_t lo=0; //lowByte
uint16_t output=0;
byte S = 0; //Schakelaar waarde
byte p = 0;
int sto = 0; //Start/stop

//Motor-1 H-brug L293D
const int motor1En1Pin = 8; //pin 45 werkt niet met Servo pin 9 tegelijk.Pin 8 ook niet
const int motor1A1Pin = 49;
const int motor1A2Pin = 47;

//Stuurmotor Servomotor Arduino 180gr
Servo Stuur; //naam van de servomotor.
int angle = 90; //instel hoek default 90.
int n = 0;

//Odo-sensor Pulsenschijf 20s.
const byte intOdoPin = 2; //interrupt
int odo = 0; //verplaatsing
int preOdo = 0; //laatste odowaarde
int snel = 0; //verplaatsing

//Clock
int Clock = 0;
unsigned long preMillis=0;
const long interval=1000; // 1 seconde is 1000 miliseconde.

//Loopconter
int loopcount = 0;

//Display
int horizontaal = 100;
int vertikaal =100;
int bat = 15;




//Setup------------------------------------------------------------
void setup(){
Wire.begin();
Serial.begin(9600);
Serial.println();
Serial.println("Mux-test");

//Bediening
dataSend = word(B11111111,B11111111); //turn every pin to input
pcf8575_write(dataSend); //turn the pcf8575 pins to input

//Motor-1
pinMode(motor1En1Pin, OUTPUT);
pinMode(motor1A1Pin, OUTPUT);
pinMode(motor1A2Pin, OUTPUT);

//Stuurmotor Servo Arduino.
Stuur.attach(9);

//Odo-sensor
pinMode(intOdoPin,INPUT_PULLUP); //ODO-sensor
attachInterrupt(digitalPinToInterrupt(intOdoPin), D1, FALLING);

//Mux TCA9548A
myMux.begin();
Serial.print("myMux.begin() :");Serial.println(myMux.begin());
if (myMux.begin() == false){ //Check de MUX.
Serial.println("Mux not detected. Freezing...");
while (1);}
Serial.println("Mux detected");

//Displays
myMux.setPort(1);
u8g2.begin();
Serial.println("Display Port-0");

myMux.setPort(2);
u8g2.begin();
Serial.println("Display Port-1");

}



//Loop---------------------------------------------------------------------------
void loop(){
unsigned long startcount=millis(); //Start looptiming

//Bediening-----------------------------------------------
pcf8575_write(dataSend); //schrijven voor lezen.
dataReceive = pcf8575_read(); //read the pcf8575 pins
for(int i=0; i<8; i++){
byte n = bitRead(hi,i);
if(n==0) S = 8-i;}
Serial.print("S0: ");Serial.print(S);

switch(S){
case 1: bitWrite(lo,0,0); break;
case 2: bitWrite(lo,1,0); break;
case 3: bitWrite(lo,2,0); break;
case 4: bitWrite(lo,3,0); break;
case 5: bitWrite(lo,4,0); angle = 10; break;
case 6: bitWrite(lo,5,0); angle = 160; break;
case 7: bitWrite(lo,6,0); sto = 1; break;
case 8: bitWrite(lo,7,0); sto = 0; break;
}
Serial.print("S1: ");Serial.print(S);
S=0;

//Output leds
// if(p == 0) {bitWrite(lo,3,0); p=1;}
// else {bitWrite(lo,3,1); p=0;}
// output = word(hi,lo);
// pcf8575_write(output);

//Motor1
Serial.print(" sto ");Serial.print(sto); //zie regel 134/135
if(sto == 1) motor1(2,100);
else motor1(0,0);

/*Hier gaat het fout.
* Het mechanisme van het starten en stoppen van de motor werkt.
Als de motor1 functie wordt aangeroepen loopt het programma niet meer.
Conflick in PWM.?????
*/


//Stuurmotor
if(angle == 10) Stuur.write(angle); // stuur hoek naar de motor.
if(angle == 160) Stuur.write(angle);
Serial.print(" angle: ");Serial.print(angle);

//Odo-sensor
Serial.print(" odo: "); Serial.print(odo);
//Snelheid
unsigned long curMillis=millis();
int curOdo = odo;
if(curMillis - preMillis >= interval){
preMillis = curMillis;
snel = curOdo - preOdo;
preOdo = curOdo;
}
Serial.print(" snel: "); Serial.print(snel);

//Displays
myMux.setPort(1); //Check de port 1
byte currentPortNumber = myMux.getPort();
// Serial.print(" CurrentPort: ");Serial.print(currentPortNumber);
oled1 (vertikaal,horizontaal,bat); //Serial.print(" Display-1");

myMux.setPort(2); //Check de port 0
currentPortNumber = myMux.getPort();
// Serial.print(" CurrentPort: ");Serial.println(currentPortNumber);
oled2();

//looptiming
unsigned long stopcount=millis(); //stop looptiming
loopcount = stopcount - startcount;
Serial.print(" loopCounter: ");Serial.println(loopcount);

// delay(1000);
}

//Functions -----------------------------

void pcf8575_write(uint16_t dt){
Wire.beginTransmission(address);
Wire.write(lowByte(dt));
Wire.write(highByte(dt));
Wire.endTransmission();}

uint16_t pcf8575_read(){
Wire.requestFrom(address,2);
if(Wire.available()){
lo = Wire.read();
hi = Wire.read();
return(word(hi,lo));}}


void motor1(int moveDir,int motSpeed){
switch(moveDir){
case 2:digitalWrite(motor1A1Pin,LOW);
digitalWrite(motor1A2Pin,HIGH);
analogWrite(motor1En1Pin, motSpeed);
break;
case 1:digitalWrite(motor1A1Pin,HIGH); [code][/code]
digitalWrite(motor1A2Pin,LOW);
analogWrite(motor1En1Pin, motSpeed);
break;
case 0:analogWrite(motor1En1Pin, motSpeed); //Stop
break;
}}

void D1(){ //interrupt routine
noInterrupts();
odo++;
interrupts();}

//Display-1
void oled1(int vert,int hor,int bat){
u8g2.firstPage(); do{
u8g2.clearBuffer(); // clear the internal menory
u8g2.setFont(u8g2_font_logisoso20_tr); // choose a suitable font
u8g2.setCursor (5,27);
if(vert<10){u8g2.print(" ");u8g2.print(vert);}
else{ if(vert<100){u8g2.print(" ");u8g2.print(vert);}
else {u8g2.print(vert);}}

u8g2.setFont(u8g2_font_logisoso20_tr); // choose a suitable font
u8g2.setCursor (82,27);
if(hor<10){u8g2.print(" ");u8g2.print(hor);}
else{ if(hor<100){u8g2.print(" ");u8g2.print(hor);}
else {u8g2.print(hor);}}

u8g2.setFont(u8g2_font_logisoso16_tr); // choose a suitable font
u8g2.setCursor (53,27);
u8g2.print("cm");
// Serial.print(" meetwaarden weergeven "); //looptest
u8g2.drawFrame(50,0,30,10); // draw a Frame meter
u8g2.drawBox (50,1,bat,8); // draw a Box meter
u8g2.drawFrame(0,0,50,32); // draw a Frame links
u8g2.drawFrame(80,0,45,32); // draw a Frame rechts
u8g2.drawFrame(50,0,30,32); // draw a Frame midden
u8g2.sendBuffer();
} while( u8g2.nextPage() );
}

//Display-2
void oled2(){
u8g2.firstPage(); do{
u8g2.clearBuffer();
u8g2.drawFrame(0,0,128,64); // draw a Frame meter
u8g2.setFont(u8g2_font_logisoso24_tr);
u8g2.setCursor (10,30); u8g2.print("Snelheid");//snelheid
u8g2.setCursor (50,60); u8g2.print(snel); //snelheid
u8g2.sendBuffer();
} while( u8g2.nextPage() );
}

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: PWM met Mega2650

Berichtdoor shooter » 15 Feb 2021, 15:52

servo en PWM en wire gebruiken timers, en misschien nog wel meer dingen die je als lib aan hebt staan.
The Servo library supports up to 12 motors on most Arduino boards and 48 on the Arduino Mega. On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins. On the Mega, up to 12 servos can be used without interfering with PWM functionality; use of 12 to 23 motors will disable PWM on pins 11 and 12.
dus kijk eens naar je timergebruik, ook serial print gebruikt trouwens een timer, etc.
je snapt hopelijk wel dat het ondoenlijk is om alle libraries na te kijken of dat goed gaat, vooral alle versies etc. dus helaas even verder puzelen.
paul deelen
shooter@home.nl

Terug naar Arduino hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 13 gasten