Skocz do zawartości

Sterowanie przód tył - problem z programem


Krawi92

Pomocna odpowiedź

Mam taki kłopot, którego nie mogę zrozumieć. Na razie sobie tylko testuje to na 2 silniczkach. Aktualnie 2 microswitche podlaczone, 1 klawisz sprawia, ze po nacisnieciu silniki sie kreca jakby pojazd mial jechac do przodu,gdy go puszcze to staja. 2 klawisz ma przy nacisnieciu sprawić jazdę do tylu i przy puszczeniu silniczki maja stanac. Zrobilem to na instrukcji switch. Problem jest taki, ze jazda do przodu mi dziala jak chce, problemem jest 2 klawisz. Po resecie programu gdy wcisne 1 klawisz, silniczki ruszaja jakby do przodu,puszczam i staja. Gdy klikne 2 klawisz silniczki jada do tylu, ale przy puszczeniu juz nie zatrzymuja się. Gdy rusze np: do przodu na moment to potem 2 klawisz nie reaguje 😕 Nie wiem czy to zła konstrukcja programu czy cos innego. 

main.c

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "init.h"

uint8_t stan;
uint8_t keylock,keylock1;

int main(){
	pwmInit();
	motorInit();
_delay_ms(20);
	sei();
	while(1){

		if(!keylock && !(PINB & (1<<FORWARD))){ // obsluga klawisza START/STOP
			keylock=1;
			stan=1;
			}else if(keylock && (PINB & (1<<FORWARD))){
				stan=2;
				keylock++;
			}

		if(!keylock1 && !(PIND & (1<<BACKWARD))){ // obsluga klawisza START/STOP
			keylock1=1;
			stan=3;
			}else if(keylock1 && (PIND & (1<<BACKWARD))){
				stan=4;
				keylock1++;
			}

		switch (stan){ // Stany motoru
			case 1:
				motorForward();
				break;
			case 2:
				MOTOR_STOP;
				break;
			case 3:
				motorBackward();
				break;
			case 4:
				MOTOR_STOP;
				break;
		}

	}
}

 

init.c

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "init.h"

void pwmInit(){
	DDRB |= (1<<PB1)|(1<<PB2); // wyjscia kanalow
	TCCR1A |= (1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);       // fast pwm10bit non inverted,64 prescaler
	TCCR1B |= (1<<WGM11)|(1<<WGM12)|(1<<CS10)|(1<<CS11);

}
void motorInit(){
	PORTD |= (1<<BACKWARD); // PULLUP klawisza tył
	PORTB |= (1<<FORWARD); // PULLUP klawisza przód
	DDRD |= (1<<MOTOR1WE_A)|(1<<MOTOR1WE_B)|(1<<MOTOR2WE_A)|(1<<MOTOR2WE_B); // sterowanie kierunkiem
}
void motorForward(){
	MOTOR_FORWARD;
	OCR1A=700;
	OCR1B=700;
}
void motorBackward(){
	MOTOR_BACKWARD;
	OCR1A=750;
	OCR1B=750;
}

init.h


#ifndef INIT_H_
#define INIT_H_

#define MOTOR1WE_B PD4
#define MOTOR1WE_A PD3
#define MOTOR2WE_B PD2
#define MOTOR2WE_A PD1
#define FORWARD PB0
#define BACKWARD PD6

#define MOTOR_FORWARD PORTD |= (1<<MOTOR1WE_B); PORTD &=~(1<<MOTOR1WE_A); PORTD &=~ (1<<MOTOR2WE_B); PORTD |= (1<<MOTOR2WE_A);
#define MOTOR_BACKWARD PORTD &=~~(1<<MOTOR1WE_B); PORTD |= (1<<MOTOR1WE_A); PORTD |= (1<<MOTOR2WE_B); PORTD &=~ (1<<MOTOR2WE_A);
#define MOTOR_STOP PORTD &=~ (1<<MOTOR1WE_B); PORTD &=~(1<<MOTOR1WE_A); PORTD &=~ (1<<MOTOR2WE_B); PORTD &=~(1<<MOTOR2WE_A);


void pwmInit();
void motorInit();
void motorForward();
void motorBackward();
#endif /* INIT_H_ */

 

Link do komentarza
Share on other sites

(edytowany)

Na razie to próbuje dojść czy to program czy sprzęt. Bo bardzo dziwnie mi to działa, ten przycisk "wstecz".Zbliżam ołówek, do przycisku to wlaczaja sie silniczki,oddalam to gasna. Wymienialem microswitche, 100nf podciagnalem rownolegle to masy... Nie wiem, dlatego pytam o program. Makra sa OK bo kreca się przod tyl. 

Biore przewód podlaczony do PD6 ktore jest wejciem, jak zwieram do masy kreca sie, jak do vcc staja,czyli ok.. Pod klawisz podlaczam i kupa

Edytowano przez Krawi92
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Nie zmieniło to nic, a keylocki w 2 warunku i tak beda zerem bo sie przekręcą, to taka eliminacja drgan styków.  Nie no zglupialem juz, wg mnie program powinien działać, nie widzę tam błędów.

Zmieniłem na PORTB na PB6 i teraz działa OK. na PD7 i PD6 jakieś cuda. Włączały sie silniki od tak jakby tam panował stan wysokiej impedancji, a przeciez do VCC podciągałem.. dziwne 

Edytowano przez Krawi92
Link do komentarza
Share on other sites

(edytowany)

Tera testowalem na PorcieC i B i smiga normalnie, a tam jakieś jaja. Ehh ile nerwów stracilem na wieczor 😄  Pytanie do kogoś kto może wie, PD6 i PD7 to wejscia do komparatora analogowego. AIN0 i AIN1, czy to moglo miec wplyw na dziwna prace klawiszy?

Edit: Cały PORTD tak mi dziwnie działa, z czego od PD1-PD4 to sterowanie kierunkiem obrotu silników.

Edit2: Znalazłem babola - #define MOTOR_BACKWARD PORTD &=~~(1<<MOTOR1WE_B);   

już któryś raz przez pomyłkę dałem taka podwójną tylde, a kompilator nie krzyczy. Ciekawi mnie co jest wynikiem takiej operacji bitowej :D:D:D

Edytowano przez Krawi92
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.