Arduino ATtiny45 servoproblem
- 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
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.
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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Arduino ATtiny45 servoproblem
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.
Re: Arduino ATtiny45 servoproblem
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.
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.
- 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
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...
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...
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
- 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
Löst!!
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.
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.
- 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
Hehe, ja ja
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.
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.
- 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
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 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.
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;
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;
}
}
Re: Arduino ATtiny45 servoproblem
Kod: Markera allt
ServoPositionOpenCal = analogRead(SERVO_OPEN_PIN);
ServoPositionOpenCal = (ServoPositionOpenCal >> 6) & 0xF;
- 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
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.
Fick lite hjälp med bit-skiftningen här, men jag gör väl något annat fel som vanligt.
Re: Arduino ATtiny45 servoproblem
Därför att du först skiftar så du har 4 bitar kvar, sen nollställer du de fyra bitarna. Prova utan "& 0xF"
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.
Kod: Markera allt
ServoPositionOpenCal = analogRead(SERVO_OPEN_PIN);
ServoPositionOpenCal = (ServoPositionOpenCal >> 6);
- 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
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.
Provade tidigt med blink-programmet och då fungerade det i alla fall. Återkommer.
- 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
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);
}
- 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
Ä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);