PWM s Atmega128

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
endthe
Příspěvky: 56
Registrován: 07 bře 2009, 01:00
Bydliště: Brno
Kontaktovat uživatele:

PWM s Atmega128

#1 Příspěvek od endthe »

zdravim vas mam maly problem s PWMkem

potrebuju ovladat 2 serva pouzivam fazove korigovane PWM

vypoctove mam vse ok ale jak mile zacnu nastavovat OCR3A a OCR3B pro serva tak se mi nehnou. Jakmile OCR3B drzim na 0 tak PWM bez problemu jede poradi nekdo co s tim

Kód: Vybrat vše


int main (void)
{
	
DDRE = 0x18; //povoleni portu PE3 a PE4 jako vystup PWM (OC3A a OC3B)
ICR3=18432;
TCCR3A=0xA0;
TCCR3B=0x12;
TCNT3H=0x00;
TCNT3L=0x00;
OCR3A=1222;
OCR3B=1222;

u08 line = 0;

	init();
	delay_1ms_u16(20);
	init_lcd();

clear_disp();

int pruchod;
int natoceni1;
int natoceni2;
char info1[20];
char info2[20];
char info3[20];
int senzor=1;
unsigned int vysledek; 
unsigned int prepocet;  
unsigned char kanal = 0b01000000;  //0x40;  0b01000000; ADC0 

		
    ADCSRA = 0x87;  
	key = 0;
	while(1){
	
	sprintf(info1, "Servo 1:  %d",OCR3A);
			sprintf(info2, "Servo 2:  %d",OCR3B);
clear_disp();
			put_string_xy(0, 0, info1);
			cursor_disp_ctrl(0x04);
			put_string_xy(0, 1, info2);
				

			while (key == 0);
	//inkrementovat pruchod
	
	 	if (key != 0) {
			switch (key) {
				case 0x11 : {OCR3A+=1;}; break;		// 1
				case 0x12 : {OCR3A+=10;}; break;		// 2
				case 0x14 : {OCR3A+=100;}; break;		// 3
				case 0x21 : {OCR3A-=1;}; break;		// 4
				case 0x22 : {OCR3A-=10;}; break;		// 5
				case 0x24 : {OCR3A-=100;}; break;		// 6
				case 0x41 : {OCR3B+=1;}; break;		// 7
				case 0x42 : {OCR3B+=10;}; break;		// 8
				case 0x44 : {OCR3B+=100;}; break;		// 9
				case 0x82 : {OCR3B-=10;}; break;		// 0
				case 0x81 : {OCR3B-=1;}; break;		// *
				case 0x84 : {OCR3B-=100;}; break;		// #
				case 0x18 :return(1);break; 						// ESC
				
						}

			//pipani
			key = 0;
			beep(200, 10);

			

					
			//***********************************		
			if(OCR3A>=2122) OCR3A=2122;  
			if(OCR3B>=2122) OCR3B=2122;
			if(OCR3A<=522) OCR3A=522;
			if(OCR3B<=522) OCR3B=522;
			
					 						
					}		  	  			
		
			   }		
_delay_ms(400);
}

Problem je v tom ze se mi generuji po sobe nejdriv OCR3A a potom OCR3B ale netusim jak je donutit zaroven

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#2 Příspěvek od Andrea »

Sice jsem nepochopila co že to dělá/nedělá, ale zkusila bych napsat čistěji tu inicializaci

Kód: Vybrat vše

TCCR3A=0xA0; 
TCCR3B=0x10;      -- Citac je nastaveny na P&FC PWM a je zastaveny
ICR3=18432;       -- Ted teprve by se melo dat zapisovat do ICR
TCNT3H=0x00; 
TCNT3L=0x00; 
OCR3A=1222; 
OCR3B=1222;
TCCR3B=0x12;      -- Tady teprve citac spustit

Uživatelský avatar
endthe
Příspěvky: 56
Registrován: 07 bře 2009, 01:00
Bydliště: Brno
Kontaktovat uživatele:

#3 Příspěvek od endthe »

No konkretne je problem v tom ze se generuji po sobe tudiz kdyz je OCR3B nulove tak OCR3A jede bez sebemensich potizi. jakmile nastavim i OCR3B tak se nejdrive OCR3A zacne cukat (myslim pohyb serva) a potom prestane jit uplne a nehjbe se ani jedno servo nevim jak jinak bych to popsal

AB

#4 Příspěvek od AB »

Zkus upravit pro svùj èip toto

Kód: Vybrat vše

//mega88
//OC1A=PB1
//OC1B=PB2

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>            


int main(void)
{         

   DDRB   |= (1<<1) | (1<<2);                        //output (OC1A OC1B)
   TCCR1A |= (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11); //mode 14, fast pwm
   TCCR1B |= (1<<WGM12) |(1<<WGM13) | (1<<CS11);     //prescaler 8
   ICR1    = 20000;    //50Hz

   for(;;)
   {
      OCR1A   = 1000;  //left
      OCR1B   = 1000;
      _delay_ms(1500);

      OCR1A   = 1500;  //center
      OCR1B   = 1500;
      _delay_ms(1500);

      OCR1A   = 2000;  //right
      OCR1B   = 2000;
      _delay_ms(1500);
   }
}

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“