Sari la conținut
ELFORUM - Forumul electronistilor

Comanda motor


criss

Postări Recomandate

Buna,

 

Lucrez la un controler pt un motor de joasa turatie(stergator de parbriz masini) si am 2 probleme.

1. temporizarea il controlez printr-un potentiometru de 10k(pana la 1 minut) si imi merge super pana nu il ametesc de cap, insemnand ca reglez aleator potentiometrul .. inainte si inapoi, atunci se opreste temporizarea dar ADCul inca functioneaza ..rezultand ca uCul nu s-a blocat.dupa un timp de stat isi da drumul si funtioneaza, dar acesta nu ma incanta prea mult.

Atasez sursa:

#include <avr/io.h>	void WiperTime(void);	void ADCPoz(void);    unsigned char ElapsedSeconds = 0;  unsigned char NeededTime;int main (void){   DDRB |= (1 << 7);    DDRD |= (1 << 5);    DDRD |= (1 << 6);    DDRD |= (1 << 7);    DDRB |= (1 << 0);     DDRB |= (1 << 2); 		DDRD |= (0 << 0); 	DDRD |= (0 << 1); 	DDRD |= (0 << 2); 	DDRD |= (0 << 3); 	DDRD |= (0 << 4); 	DDRC |= (0 << 1);    DDRB |= (1 << 1);    TCCR1B |= ((1 << CS10) | (1 << CS11));    ADCSRA |= (1 << ADPS1) | (1 << ADPS0);    ADMUX |= (1 << REFS0);    ADMUX |= (1 << ADLAR);    ADCSRA |= (1 << ADFR);     ADCSRA |= (1 << ADEN);     ADCSRA |= (1 << ADSC);   for(;;)  	{if ((PIND & (1<<1)) && (~PIND & (1<<2)) && (~PIND & (1<<3)) && (~PIND & (1<<4)))  {	WiperTime();	ADCPoz();  }else if ( (PIND & (1<<2)) && (~PIND & (1<<1)) && (~PIND & (1<<3)) && (~PIND & (1<<4)) ){ PORTD |= (1 << 5); // Turn on LED2PORTB &= ~(1 << 7); // Turn off LED1PORTD &= ~(1 << 6); // Turn off LED3PORTD &= ~(1 << 7); // Turn off LED4PORTB &= ~(1 << 1); // Turn off LED1 } else if ( (PIND & (1<<3)) && (~PIND & (1<<1)) && (~PIND & (1<<2)) && (~PIND & (1<<4)) ){ PORTD |= (1 << 6); // Turn on LED3PORTB &= ~(1 << 7); // Turn off LED1PORTD &= ~(1 << 5); // Turn off LED2PORTD &= ~(1 << 7); // Turn off LED4PORTB &= ~(1 << 1); // Turn off LED1 PORTB |= (1 << 1); } else if ( (PIND & (1<<4)) && (~PIND & (1<<1)) && (~PIND & (1<<2)) &&  (~PIND & (1<<3))){ PORTD |= (1 << 7); // Turn on LED4PORTB &= ~(1 << 7); // Turn off LED1PORTD &= ~(1 << 5); // Turn off LED2PORTD &= ~(1 << 6); // Turn off LED3PORTB &= ~(1 << 1); // Turn off LED1 } else if ( (~PIND & (1<<1)) && (~PIND & (1<<2)) &&  (~PIND & (1<<3)) && (~PIND & (1<<4)) ){PORTB &= ~(1 << 7); // Turn off LED1PORTD &= ~(1 << 5); // Turn off LED2PORTD &= ~(1 << 6); // Turn off LED3PORTD &= ~(1 << 7); // Turn off LED4 }}		}void WiperTime(void){ if (TCNT1 >= 15624)      	{        	 TCNT1 = 0;          	ElapsedSeconds++;				 	PORTB &= ~(1 << 1); 	         		if (ElapsedSeconds == NeededTime)           		{            		ElapsedSeconds = 0;            		PORTB |= (1 << 1);							}									}			}void ADCPoz(void){      if(ADCH < 51)      {	    PORTB |= (1 << 7); 		 PORTD &= ~(1 << 5); // Turn off LED2		 PORTD &= ~(1 << 6); // Turn off LED3         PORTD &= ~(1 << 7); // Turn off LED4		 PORTB &= ~(1 << 0); // Turn off LED5			NeededTime = 6; // Set time	      }	else if((ADCH > 51) && (ADCH < 102))      {         PORTD |= (1 << 5); // Turn on LED2		 	 	PORTB &= ~(1 << 7); // Turn off LED1		 PORTD &= ~(1 << 6); // Turn off LED3         PORTD &= ~(1 << 7); // Turn off LED4		 PORTB &= ~(1 << 0); // Turn off LED5		 NeededTime = 10; // Set time		 		}	else if((ADCH > 102) && (ADCH < 153))      {         PORTD |= (1 << 6); // Turn on LED3		 	 	PORTB &= ~(1 << 7); // Turn off LED1		 PORTD &= ~(1 << 5); // Turn off LED2         PORTD &= ~(1 << 7); // Turn off LED4		 PORTB &= ~(1 << 0); // Turn off LED5		 NeededTime = 20; // Set time		 		}		else if((ADCH > 153) && (ADCH < 204))      {         PORTD |= (1 << 7); // Turn on LED4		 	 	PORTB &= ~(1 << 7); // Turn off LED1		 PORTD &= ~(1 << 5); // Turn off LED2		 PORTD &= ~(1 << 6); // Turn off LED3		 PORTB &= ~(1 << 0); // Turn off LED5		 NeededTime = 40; // Set time		}		else if((ADCH > 204) && (ADCH < 255))      {         PORTB |= (1 << 0); // Turn on LED5	 	 	PORTB &= ~(1 << 7); // Turn off LED1		 PORTD &= ~(1 << 5); // Turn off LED2		 PORTD &= ~(1 << 6); // Turn off LED3         PORTD &= ~(1 << 7); // Turn off LED4		NeededTime = 60; 	}}

2. tot in cadrul acestui proiect am o alta problema si mai precis cu capatul de cursa.cand ajunge motorul in pozitia de unde a pornit sa se opreasca(are un sezor HALL ce intrerupe pe masa) sau daca temporizatorul a pornit motorul el isi continua cursa pana ajunge la capat:

 

void Limit(void){if (~PIND & (1<<0))	 { 	PORTB &= ~(1 << 1); // Turn off LED1	 } 	else 	{	 PORTB |= (1 << 1); 	}}
merge totul bine pana nu actionez temporizarea! de aici nu mai vrea sa porneasca, impulsul dat de temporizator este de scurta durata si doar nici nu misca motorul deoarece intra in funtiune limitarea(considerand ca motorul a ajuns la capat de cursa si intrerupe semnalul pe PB1)

 

cum as putea executa partea de cod anterior dupa ce s-a terminat temporizarea adica dupa ce comanda a fost data: "WiperTime();"

For(;;){if ((PIND & (1<<1)) && (~PIND & (1<<2)) && (~PIND & (1<<3)) && (~PIND & (1<<4)))  {	WiperTime();	ADCPoz();         Limit(); }}

Multumesc

Link spre comentariu
  • Răspunsuri 3
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • criss

    2

  • catkiller

    2

Bun, codul e scris pentru AT90CAN128, poti sa adaptezi pe orice atmega,

Trebuie sa faci ceva de genu ca sa mearga treaba bine

(iar cand faci calculul turatiei in functie de adc trebuie sa te asiguri ca faci vreo impartire la 0 sau ceva de genul, se blocheaza)

 

ISR_intrerupere_de 5ms ///5ms e suficient

{

////la fiecare interupere citesti adc-ul

ADC_read

setezi pwm-ul daca valoarea de la adc se modifica

set_PWM

}

void main()

{

initializare timere

init interrupts

while(1);

}

 

 

////////////////////////////////////////////////////////////////////////////////// TIMER1 - generare de PWM (fast PWM)void FastPWM_Init_T1(void){	// pinii de iesire al semnalului	DDRB |= _BV(PB5) | _BV(PB6);		// Control Register - ambele canale fast pwm pe 10 biti ---> 1024	TCCR1A |= _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10) | _BV(WGM11);		// prescaler de 8	TCCR1B |= _BV(WGM12) | _BV(CS11);		// pwm initial 0	OCR1A = 0;	OCR1B = 0;	}//////////////////////////////intrerupere de 5ms pentru quart de 16Mhzvoid Timer2_Init(void){	// setam prescaler la 1024	TCCR2A |= _BV(CS22) | _BV(CS21) | _BV(CS20);		// timer-ul este intrerupt "la comparatie"	TIMSK2 |= _BV(OCIE2A);		// setare valoare de comparatie -> 5ms	OCR2A = 80;		sei();}// intrerupere la 5 msISR(TIMER2_COMP_vect){////code}////////////////////////////////////////
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări