Arduino ATtiny45 servoproblem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino ATtiny45 servoproblem

Inlägg av Magnus_K »

Skulle vilja lägga upp layouten men vet inte hur jag ska göra för att det inte ska bli rörigt.

Nedan är en bild på "det väsentliga". VIN och EN är sammandragna. 100n mellan SW och BOOT, 22nF på SS. Feedbacken fungerar antar jag då den reglerar fint till 6V.
layout.JPG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Xyzzy
Inlägg: 1222
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Re: Arduino ATtiny45 servoproblem

Inlägg av Xyzzy »

Ja nära C7 borde du ha en rejält högre kapacitans med låg ESR. Går nog att patcha in utan allt för mycket meck.
Borre
Inlägg: 4564
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: Arduino ATtiny45 servoproblem

Inlägg av Borre »

Ja var och hur långt bort sitter kondensatorerna på ingången?
De bör som som sagt sitta åtminstone några uF nära ingången, några millimeter helst.

Feedbacken ska du ta direkt från utgångskondensatorn och inte induktansen.

Jag hade tagit bort allt onödigt först, tex D3, mer kapacitans på ingången och dra om feedbacken till kondensatorn.
Sen bör du mäta med oscillioskop på ingången, feedbacken, visa gärna bild på hur det ser ut med och utan last.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino ATtiny45 servoproblem

Inlägg av Magnus_K »

Dom är för långt borta :)

Ok. Nu har jag dragit en ny tråd från utgångskondingen direkt till feedbacken. Kapade den gamla ledningen. D3 är borta. 10uF sitter på ingången.
Utan last ser det verkligen superfint ut men nedan ser ni hur det ser ut med ett 47Ω-motstånd som belastar på utgången...
NewFile2.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino ATtiny45 servoproblem

Inlägg av Magnus_K »

Löst!! :whoho:

Det är alltid roligt att få ge lite feedback. Tyvärr inget jättespännande men ändå.
Har suttit några timmar och jämfört med databladet och kunde verkligen inte hitta något fel. Eller jo, ni har påvisat flera designfel och dom suger jag åt mig som en svamp.

Denna IC var den första komponenten någonsin jag lödde med hetluftstationen och antagligen eldade jag alldeles för länge. Antingen det eller så skadade jag den när jag hade ett så litet motstånd för att ställa frekvensen.
Oavsett så lödde jag precis bort regulatorn och fick dit en ny och nu funkar kortet precis som tänkt! Regulatorn orkar gott och väl med servo.
Ja, så glad så jag inte ens kan skriva begriplig svenska, men förhoppningsvis förstår ni vad inlägget handlar om :)

Tack för all hjälp så länge! Fortfarande lite programmering kvar men nu fungerar hårdvaran som den ska i alla fall. :tumupp:
Användarvisningsbild
Xyzzy
Inlägg: 1222
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Re: Arduino ATtiny45 servoproblem

Inlägg av Xyzzy »

Weeeeee, ja den såg jag inte :D :oops:
Snyggt jobbat!
Borre
Inlägg: 4564
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: Arduino ATtiny45 servoproblem

Inlägg av Borre »

Bra! Du ser, inte så svårt med switchat ändå. ;)
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino ATtiny45 servoproblem

Inlägg av Magnus_K »

Hehe, ja ja :wink:
Men man får lite dåligt samvete när man ber om hjälp med något och ni vet inte hela bakgrunden. Lite som att säga A utan att säga B. Ber om ursäkt för det.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino ATtiny45 servoproblem

Inlägg av Magnus_K »

Kör vidare i den här tråden med lite programmeringshjälp.

Hela programmet ser ut som nedan. Det jag inte får till är den analoga avläsningen och misstänker jag rör till det med storlek på variabler och annat.
Koden går ut på att jag har en default-puls ut till servot som sedan modifieras med att lägga på ett värde.
Det görs här i while-loopen -> ActiveServoPositionPulse = ServoPositionOpen + ServoPositionOpenCal;
Jag har bekräftat att calState är aktivt under dom två första minutrarna genom att kommentera bort den nuvarande koden och ge ServoPositionOpenCal ett fast värde.

Så egentligen är det

Kod: Markera allt

ServoPositionOpenCal = analogRead(SERVO_OPEN_PIN);
ServoPositionOpenCal = (ServoPositionOpenCal >> 6) & 0xF;
som jag tror inte gör som jag vill.
Här vill jag alltså läsa in dom 10 bitarna från ADC:n, minska upplösningen till ett värde mellan 0-15 och sedan skriva detta nya värde till ServoPositionOpenCal.
Ser ni något uppenbart fel? Jag trodde först att jag hittat felet då variablen bara var en uint8, men det tycks inte bli bättre nu när den är 16 bitar.

Kod: Markera allt

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
#define F_CPU 8000000UL
#define SERVO_PORT PORTB
#define SERVO_CMD_PIN PB0
#define SERVO_CLOSE_PIN PB3
#define SERVO_OPEN_PIN PB4
#define RADIO_OPEN_PIN PB1
#define RADIO_CLOSE_PIN PB2
#define SERVO_FREQ 11 //Högre siffra ger lägre frekvens
 
 
volatile uint8_t freqCounter = 0;
volatile uint16_t calCounter = 0;
volatile uint8_t calState = 1;
volatile uint8_t ServoPositionClose = 150;
uint16_t ServoPositionCloseCal = 0;
volatile uint8_t ServoPositionOpen = 146;
uint16_t ServoPositionOpenCal = 0;
uint8_t ActiveServoPositionPulse = 148; // 161 = 1500us, 135 = 1900us
 
static inline void initTimer1(void)
{
  TCCR1 |= (1 << CTC1);  // clear timer on compare match
  TCCR1 |= (1 << CS13); // | (1 << CS11) | (1 << CS10); //clock prescaler
  OCR1C = 255; // compare match value
  TIMSK |= (1 << OCIE1A); // enable compare match interrupt
}
 
ISR(TIMER1_COMPA_vect)
{
        freqCounter++;
        
        if(calState){
          calCounter++;
    
          if(calCounter >= 0xFFFF){
              calState = 0;
          }
        }        
        if(freqCounter == SERVO_FREQ){
            SERVO_PORT |= (1<<SERVO_CMD_PIN);
            OCR1C = 255 - ActiveServoPositionPulse;
        }
        if(freqCounter > SERVO_FREQ){
            SERVO_PORT &= ~(1<<SERVO_CMD_PIN);
            freqCounter = 0;
            OCR1C = 105;
        }
 
}
 
int main(void)
{
  // initializations
  pinMode(SERVO_CMD_PIN, OUTPUT);
  pinMode(SERVO_CLOSE_PIN, INPUT);
  pinMode(SERVO_OPEN_PIN, INPUT);
  pinMode(RADIO_OPEN_PIN, INPUT);
  pinMode(RADIO_CLOSE_PIN, INPUT);

  initTimer1();        // initialize timer registers
  sei();               // enable interrupts
 
 
  while(1)
  {
    if(calState){

      ServoPositionOpenCal = analogRead(SERVO_OPEN_PIN);
      ServoPositionOpenCal = (ServoPositionOpenCal >> 6) & 0xF;
      
    }
          
    _delay_ms (1000);
    ActiveServoPositionPulse = ServoPositionOpen + ServoPositionOpenCal;
   
  }
}
Glattnos
Inlägg: 2972
Blev medlem: 29 oktober 2009, 20:01:18

Re: Arduino ATtiny45 servoproblem

Inlägg av Glattnos »

Kod: Markera allt

ServoPositionOpenCal = analogRead(SERVO_OPEN_PIN);
ServoPositionOpenCal = (ServoPositionOpenCal >> 6) & 0xF;
Gör inte detta att ServoPositionOpenCal alltid blir 0?
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino ATtiny45 servoproblem

Inlägg av Magnus_K »

Det är exakt så servot beter sig men förstår inte hur. Har du lust att förklara?

Fick lite hjälp med bit-skiftningen här, men jag gör väl något annat fel som vanligt.
Glattnos
Inlägg: 2972
Blev medlem: 29 oktober 2009, 20:01:18

Re: Arduino ATtiny45 servoproblem

Inlägg av Glattnos »

Därför att du först skiftar så du har 4 bitar kvar, sen nollställer du de fyra bitarna. Prova utan "& 0xF"

Kod: Markera allt

ServoPositionOpenCal = analogRead(SERVO_OPEN_PIN);
ServoPositionOpenCal = (ServoPositionOpenCal >> 6);
Edit: Förlåt, du nollställer dom ju inte, du nollställer de andra bitarna, vilket du iofs inte borde behöva. Men jag får fundera lite till.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino ATtiny45 servoproblem

Inlägg av Magnus_K »

Ska förenkla allt igen och se så analogRead() fungerar som det ska.
Provade tidigt med blink-programmet och då fungerade det i alla fall. Återkommer.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino ATtiny45 servoproblem

Inlägg av Magnus_K »

Hmm, testade den här test-koden nedan och fungerar kanon. Blinkar en LED på utgången och intervallet justeras med en av pottarna.

Kod: Markera allt

int sensorPin = PB4;    // select the input pin for the potentiometer
int ledPin = PB0;      // select the pin for the LED
int sensorValue = 0;  // variable to store the value coming from the sensor

void setup() {
  // declare the ledPin as an OUTPUT:
  pinMode(ledPin, OUTPUT);
  pinMode(sensorPin, INPUT);
}

void loop() {
  // read the value from the sensor:
  sensorValue = analogRead(sensorPin);
  // turn the ledPin on
  digitalWrite(ledPin, HIGH);
  // stop the program for <sensorValue> milliseconds:
  delay(sensorValue);
  // turn the ledPin off:
  digitalWrite(ledPin, LOW);
  // stop the program for for <sensorValue> milliseconds:
  delay(sensorValue);
}
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino ATtiny45 servoproblem

Inlägg av Magnus_K »

Äsch, tänkte eliminera möjligheten att det blev fel med bit-skiftiningen. Nedan fungerade inte heller. Vad fasen kan det vara...

Kod: Markera allt

      ServoPositionOpenCal = analogRead(SERVO_OPEN_PIN);
      ServoPositionOpenCal = (ServoPositionOpenCal / 80);
Skriv svar