Sida 3 av 5
Re: Arduino ATtiny45 servoproblem
Postat: 24 februari 2018, 16:20:02
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". V
IN och EN är sammandragna. 100n mellan SW och BOOT, 22nF på SS. Feedbacken fungerar antar jag då den reglerar fint till 6V.
layout.JPG
Re: Arduino ATtiny45 servoproblem
Postat: 24 februari 2018, 16:33:19
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.
Re: Arduino ATtiny45 servoproblem
Postat: 24 februari 2018, 16:59:28
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.
Re: Arduino ATtiny45 servoproblem
Postat: 24 februari 2018, 20:57:41
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
Re: Arduino ATtiny45 servoproblem
Postat: 25 februari 2018, 21:58:29
av Magnus_K
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.
Re: Arduino ATtiny45 servoproblem
Postat: 25 februari 2018, 22:00:45
av Xyzzy
Weeeeee, ja den såg jag inte
Snyggt jobbat!
Re: Arduino ATtiny45 servoproblem
Postat: 26 februari 2018, 16:01:44
av Borre
Bra! Du ser, inte så svårt med switchat ändå.
Re: Arduino ATtiny45 servoproblem
Postat: 26 februari 2018, 17:58:57
av Magnus_K
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.
Re: Arduino ATtiny45 servoproblem
Postat: 4 mars 2018, 17:39:57
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;
}
}
Re: Arduino ATtiny45 servoproblem
Postat: 4 mars 2018, 18:17:20
av Glattnos
Kod: Markera allt
ServoPositionOpenCal = analogRead(SERVO_OPEN_PIN);
ServoPositionOpenCal = (ServoPositionOpenCal >> 6) & 0xF;
Gör inte detta att ServoPositionOpenCal alltid blir 0?
Re: Arduino ATtiny45 servoproblem
Postat: 4 mars 2018, 18:19:21
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.
Re: Arduino ATtiny45 servoproblem
Postat: 4 mars 2018, 18:29:24
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.
Re: Arduino ATtiny45 servoproblem
Postat: 4 mars 2018, 18:50:08
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.
Re: Arduino ATtiny45 servoproblem
Postat: 4 mars 2018, 19:05:24
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);
}
Re: Arduino ATtiny45 servoproblem
Postat: 4 mars 2018, 19:21:01
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);