Härligt!torake wrote:Bilen är inte längre till salu, förresten. Jag har redan förhört mig om förvaring till nästa vinter.
Vad ska du göra åt reläet? Ska du felsöka den eller byta ut den helt?
Härligt!torake wrote:Bilen är inte längre till salu, förresten. Jag har redan förhört mig om förvaring till nästa vinter.
aroncbds wrote:Härligt!torake wrote:Bilen är inte längre till salu, förresten. Jag har redan förhört mig om förvaring till nästa vinter.
Vad ska du göra åt reläet? Ska du felsöka den eller byta ut den helt?
torake wrote:Nybes idag U.A.
Besiktningskillarna som var obetydligt äldre än bilen var förbluffade över att den var så fräsch, speciellt inuti. De fipplade på alla knappar och lyckades spruta spolarvätska i håret på sig själva eftersom takluckan var öppen och TROTS att jag sade till den ene att stänga luckan först.
Nu är det två år till nästa besiktning. Sidoblinkersarna har blivit förpassade till en påse i garaget.
aroncbds wrote:Haha, underbart! Ska du åka på någon träff med den i sommar?
aroncbds wrote:Läckert! Vad är det för produkt? Eller har du designat sen själv från grunden?
Haha, now we're talkin! Använder du interrupts eller kör du pollat? Vore enormt kul att se din firmware!torake wrote:aroncbds wrote:Läckert! Vad är det för produkt? Eller har du designat sen själv från grunden?
Det är en Atmega328 på en arduino-uno-kompatibel bräda, med en LM2596 spänningsregulator samt fem egendesignade transistorsteg för in- och utsignaler. Två externa 12V-relän för att driva större laster.
Tror den är kompatibel med din fläktregulator, eller hur?
Hade jag gjort om den hade jag använt samma LM2596, fast en Arduino Nano (-kompatibel) och ett färdigt reläkort för att spara tid och plats.
aroncbds wrote:Haha, now we're talkin! Använder du interrupts eller kör du pollat? Vore enormt kul att se din firmware!
En avläsning av en digital ingång kostar en klockcykel på en Uno, motsvarande en 1/16-dels us (mikrosekund). En analog avläsning tar runt 100us, beroende på upplösning (hur du ställer in prescalern). Så loopcykelperioden är en funktion av vad du gör i loopen (antalet avläsningar, dess utförande samt eventuell övrig logik). Har du alternativa flöden i programmet, så kan det vara svårt att förutse/korrigera jittret som uppstår, vilket gör att CPU'n skulle kunna missa hårda deadlines för t. ex. kickdown. 1000 loopar/sekund låter realistiskt, men frågan är alltså vad du gör i loopen.torake wrote:aroncbds wrote:Haha, now we're talkin! Använder du interrupts eller kör du pollat? Vore enormt kul att se din firmware!
Firmwaren håller på att ta form i mitt huvud för närvarande. Just nu har jag bara en pollande loop som räknar pulser på ingångarna och skriver ut frekvenser på seriekonsolen.
Behöver inga interrupt i den här applikationen tror jag, utan det går nog att polla. Däremot blir ju reglerloopen lite knepig eftersom den skall passa både lugn och våldsam körning och allt däremellan, med bara hastighet och varvtal som input.
Har du mätt hur snabbt atmegan snurrar i en loop där man gör ett fåtal operationer och sedan en kortare delay t.ex. delay(1)? Är det nära 1000 loopar/sekund eller är det väsentligt lägre/högre? Frågar eftersom jag får rpm-signalen till 40Hz på tomgång, och det skulle motsvara 800rpm...
Code: Select all
#define UPSHIFT_FREQ 17 // 17km/h assuming observation time is 250ms
#define DOWNSHIFT_FREQ 12 // 12km/h
#define REV_LIM_LOW 84 // 3400rpm, we must go below this before kickdown is reactivated (hysteresis)
#define REV_LIM_HIGH 95 // 3800rpm but (due to low sampling frequency?) the signal is not accurate near and above 100
#define DOWNSHIFT_PIN 8
#define KICKDOWN_PIN 9
#define SPEED_PIN 2
#define RPM_PIN 4
#define PRG_PIN 7
int freq_rpm;
int freq_spd;
int freq_rpm_next;
int freq_spd_next;
int kickdown_enabled;
int downshift_active;
int counter[3];
int prevfq[2];
int nextfq[2];
int prevstate[2];
// the setup function runs once when you press reset or power the board
void setup() {
int i;
for (i=0;i<3;i++)
counter[i]=0;
for (i=0;i<2;i++) {
prevstate[i]=0;
prevfq[i]=0;
nextfq[i]=0;
}
pinMode(SPEED_PIN, INPUT);
pinMode(RPM_PIN, INPUT);
pinMode(PRG_PIN, INPUT);
// initialize digital pin 13 as an output.
pinMode(13, OUTPUT);
pinMode(DOWNSHIFT_PIN, OUTPUT);
pinMode(KICKDOWN_PIN, OUTPUT);
Serial.begin(9600);
kickdown_enabled = 0;
digitalWrite(KICKDOWN_PIN,LOW);
downshift_active = 0;
digitalWrite(DOWNSHIFT_PIN,LOW);
}
int update_freq(int measure) {
int instate7 = digitalRead(7);
int instate4 = digitalRead(4);
int instate2 = digitalRead(2);
if (instate2 != prevstate[0])
counter[0]++;
if (instate4 != prevstate[1])
counter[1]++;
prevstate[0] = instate2;
prevstate[1] = instate4;
counter[2]++;
if (counter[2] >= measure) {
freq_spd=counter[0];
freq_spd_next=freq_spd*2-prevfq[0]; // extrapolate - we use this value when time is important
prevfq[0]=counter[0];
counter[0]=0;
freq_rpm=counter[1];
freq_rpm_next=freq_rpm*2-prevfq[1];
prevfq[1]=counter[1];
counter[1]=0;
counter[2]=0;
return(1);
}
return(0);
}
void print_state() {
Serial.print(freq_spd);
Serial.print(" ");
Serial.print(freq_spd_next);
Serial.print("\t");
Serial.print(freq_rpm);
Serial.print(" ");
Serial.print(freq_rpm_next);
Serial.print("\t");
if (downshift_active) {
Serial.println("1ST");
} else {
Serial.println("");
}
}
// the loop function runs over and over again forever
void loop() {
if (update_freq(250)) {// 4 times per sec counting both flanks gives a frequency value corresponding to km/h
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
print_state();
} else {
digitalWrite(13, LOW);
}
// The shift hysteresis would cause us to overshoot the desired shift point, so use the extrapolated value
if (freq_spd_next > UPSHIFT_FREQ && downshift_active) {
digitalWrite(DOWNSHIFT_PIN,LOW);
downshift_active=0;
}
// only pull kickdown solenoid if engine actually is running
if (freq_rpm > 0 && freq_spd <= DOWNSHIFT_FREQ && !downshift_active) {
digitalWrite(DOWNSHIFT_PIN,HIGH);
downshift_active=1;
}
// The shift hysteresis is not an issue since REV_LIM_HIGH << max rev.
if (freq_rpm > REV_LIM_HIGH && kickdown_enabled) {
digitalWrite(KICKDOWN_PIN,LOW);
kickdown_enabled=0;
}
if (freq_rpm > 0 && freq_rpm <= REV_LIM_LOW && !kickdown_enabled) {
digitalWrite(KICKDOWN_PIN,HIGH);
kickdown_enabled=1;
}
delay(1);
}
Karlie wrote:Lägg lite granris inunder bilen med, så säkerställer du att bilen blir fri från nyfikna gnagare i vinter.
Users browsing this forum: No registered users and 16 guests