Gå til innhold

prosjekt: ATMega Viftekontroll : Update 270905


Anbefalte innlegg

Videoannonse
Annonse
  • 4 uker senere...

tar tid dette prosjektet... (eller så er det vell det at det er lenge mellom hver gang jeg gjør noe)

 

har i alle fall gjort litt mer nå, og tenkte jeg skulle legge ut firmwaren jeg har til nå, slik at andre som vil bygge denne kan se på koden min og jobbe videre med den eller bare bruke den som den er... (noe som ikke er mye å skryte av for tiden egentlig)

 

alle hardware ting er programmert og funker (til en viss grad).

temperaturavlesning, LCD skjerm, PWM til viftene og RS232 funker fint, avlesning av viftehastighet er litt så som så enda, men funker delvis (på full hastighet funker den, men får feil resultat en god del ganger, på lav hastighet gir den for mye og ofte helt feil) må vell prøve å fikse på dette, men det er jo ikke en kritisk ting da (ikke for meg i alle fall).

 

**koden som er her funker ikke hvis LCD-skjermen ikke er koblet til, og avlesning av hastighet brukes ikke. Den kjører i "auto" med viftene av under 25 grader C og fult på over 55 grader C.

 

viftekontroll.zip <-- kildekode og ferdigkompilert hex-fil

 

post-51478-0-10483700-1329947031_thumb.jpg

 

post-51478-0-60798400-1329947043_thumb.jpg

Endret av Dr_VingTor
Lenke til kommentar
  • 1 måned senere...
  • 3 måneder senere...

Så det du sier er at du MÅ ha en LCD skjerm for avlesning? Kan jeg bruke dette til å få bare temperatur avlesning på pc'en fra NTC motstander?

Tenkte meg bare denne delen (bildet) og lage et bilde eller en tabell som jeg kan lese av på pc'en...

Hvordan vil ledningsvalget virke inn på avlesningen, dette er vel bare en programmeringssak? Vurderte å bruke en tp kabel fra koblingsboksen til kortet, og slike ledninger som er i tp kabler som forlengning til termometerene

post-8899-1140297959_thumb.jpg

Lenke til kommentar

må ikke ha slik alfanumerisk skjerm for avlesning nei, men for min del så var det enklere da jeg ikke er så flink til å programmere på PC siden enda.

 

kan fint lage kretsen slik at en sender temperaturinfoen tilbake til en PC, for så å lage et program der som viser det i et vindu. Blir en del programmering på PC siden da. Og firmwaren jeg har nå må i tilfelle skrives om litt (må legge til en funksjon som sender temp info til PC). Men det er fult mulig.

 

når det gjelder ledningsvalg til NTC motstandene trur jeg TP-kabel kan være et godt valg, men har ikke mye erfaring på området så skal ikke si noe sikkert. ved NTC så måler en jo bare DC spenningen, så eneste problem jeg ser er at veldig lange kabler gir indusert spenning og kanskje litt motstand.

Lenke til kommentar

Men dette kan jo kompenseres ved at du legger til ekstra på temperaturen...

eks: Du måler X=20º på pc'en->virkelig temperatur er Y=22º ~ Du legger til X+2 og får Z=Y=22º

Har du noen linker til noen som har et kretsskjema/program ol. til en slik dupeditt som jeg leter etter?

Lenke til kommentar

jepp, du har en enkel løsning der.

 

har ikke noe annet en det jeg har laget selv. PSUen i serveren min tok kvelden i forrige uke så den er nede for tiden (som folk kanskje har merket) så filene er dessverre ikke tilgjengelig for tiden. Programmet jeg har på PC siden kan foreløpig bare endre viftehastigheten (fra et lite java program jeg skrev). Har litt mye å gjøre for tiden, så ting går ikke fort framover. har planer om å lage bedre program på PC siden (i C eller C++) men har ikke hatt tid til å lære meg det ordentlig, og det kan se ut som det tar en stund, så kan nok ikke hjelpe deg der.

Lenke til kommentar
  • 3 måneder senere...

Virker som et artig prosjekt ( selv om jeg ikke får sett noen av bildene dine ).

har lurt på å gjøre noe sånt selv, men har vært for lat.

 

Jeg er nyskjerrig på hvilken algoritme du bruker for å regulere hastigheten, er det en pingpong-regulator eller bruker du noe mer fancy?

Lenke til kommentar

Algoritmen for å regulere hastigheten er ikke mye å skryte av akkurat...

 

måler temp med ADC og setter ny hastighet:

if((TempSensors[i]< panic_temp) && (TempSensors[i]> stop_temp))
{
fanSpeed[i] = (uint8_t) ((float)TempSensors[i])/((float)panic_temp)*255;
}

du kan se det fra kildekoden egentlig...

men har hatt reguleringsteknikk på skolen i vår, så nå kunne jeg jo implementert et system som ville gitt en bedre regulering, men det er ikke noe jeg kommer til å prioritere...

 

prosjektet har ligget dødt ganske lenge nå, mye pga at jeg hadde kommet til et sted hvor alt virket sånn passe og jeg har ikke giddet gjøre noe mer med det (typisk meg... bygger noe og når det virker så blir det bare liggendes)... men jeg har jobbet litt mer med programkoden i det siste og prøver nå å få bootloaderen til å virke slik at det blir lettere å oppgradere og teste ut ny software.

 

pingpong-regulator? har ikke hørt om det, hva går den ut på?

 

(har fiksa linkene nå så de bør virke...)

Lenke til kommentar

Regner med dere bruker balchen sin bok i reguleringsteknikk? han har en god beskrivelse av diskrete regulatorer i kapittel 11.

 

Jeg holder for øyeblikket på med en PID regulator for et TEC-element. Du må gjerne ta en titt på koden hvis du ønsker.

 


void TEC_control() {

 //---  parameter and variable assignment ----
const static volatile uint16_t *Ti = (uint16_t *) (PARAM_BASE_ADR + TCTRL_TI); //integrator time constant
const static volatile uint16_t *Td = (uint16_t *) (PARAM_BASE_ADR + TCTRL_TD); //derivator time constant
const static volatile uint16_t *Kp = (uint16_t *) (PARAM_BASE_ADR + TCTRL_KP); //gain
const static volatile uint16_t *Ts = (uint16_t *) (PARAM_BASE_ADR + TCTRL_TS); //sampletime


const uint16_t *SHTempSet  = (uint16_t *) (PARAM_BASE_ADR + SHTEMP_SET);
uint16_t       *SHTempRead = (uint16_t *) (PARAM_BASE_ADR + SHTEMP_READ);

int *LastControllerOutput = (int *) (PARAM_BASE_ADR + CTRL_OUT); 

short int       *TEC_Out = (short int *) (PARAM_BASE_ADR + TEC_OUT);

int            TempError[3];

   
   TempError[0] = ( SHTempRead[0] - *SHTempSet) >> 2;
   TempError[1] = ( SHTempRead[1] - *SHTempSet) >> 2;
   TempError[2] = ( SHTempRead[2] - *SHTempSet) >> 2;
   
  
                       

//  ------------ begin control algorithm ----------------------

int ControllerOutput = *LastControllerOutput;
      
//proportional term
 ControllerOutput += (TempError[0] * *Kp >> 8);   
 ControllerOutput -= (TempError[1] * *Kp >> 8);
  
      
//integral term
 if((*Ti < INTEGRATOR_TC_MAX) && (*Ti > 0))               
   if( !((ControllerOutput > 254) && (TempError[0] > 0)) && 
       !((ControllerOutput < 1) && (TempError[0] < 0)) ) 
     ControllerOutput +=  (TempError[0] * *Kp >> 8) * (*Ts)/(*Ti);    

//derivative term       
 if(*Td > 0) 
 {
  ControllerOutput += (TempError[0] * *Kp >> 8) * (*Td)/(*Ts);
  ControllerOutput -= (TempError[1] * *Kp >> 8) * (2 * (*Td)/(*Ts));
  ControllerOutput += (TempError[2] * *Kp >> 8) * (*Td)/(*Ts);
  }
      
 *LastControllerOutput = ControllerOutput;

//  ------------ end control algorithm ----------------------   
       
 
//shift the temperature readings
 SHTempRead[2] = SHTempRead[1];
 SHTempRead[1] = SHTempRead[0];
       
 
 
 /*clamping output between 0 and 255 */
 if(ControllerOutput > 254)  *TEC_Out = 255;
 else if(ControllerOutput < 1) *TEC_Out = 0;
 else *TEC_Out = ControllerOutput;


 printf("Time: %u, Output: %d, TEC out:%d\n",clock(), ControllerOutput, *TEC_Out);  


}

 

 

En pingpong-regulator fungerer som en termostat (blir omvendt da). Fullt pådrag ved for høy temperatur, og null ved for lav temperatur.

 

Vet forøvrig hvordan det er med ufullførte prosjekter, jeg har harddisken full av dem selv :)

Endret av kurant
Lenke til kommentar

bruker balchen sin bok ja... vi hadde ikke så mye av diskret regulering, bare hvordan vi går fra s til z vha. s = 2/T*(z-1)/(z+1). Men jeg har jo hatt både info.sig og dig.sig så dette er ikke noe problem for meg om jeg vil gjøre dette, lære mye tilsvarende og ting som kan brukes derfra...

 

jeg har nok brukt noe ping-pong-ish jeg da, av under en viss temp og full guffe over en viss temp, men jeg har mellomting også...

 

å lage en diskret regulator som dette er jo fult mulig, men jeg har et problem og det er med hvordan jeg laga viftekontrollen... Jeg lager PWM til viftene i software (fordi jeg ville ha flere PWM kanaler enn den hadde i HW), men den bruker MYE CPU-tid på å lage denne PWMen (ca 2/3). Pga dette kan det hende at min T (samplingstid) blir for lang til at jeg kan lage en regulator som fungerer bra nok... men temperaturvariasjonene er jo ikke så raske så det trenger ikke være noe problem. Har ikke regna noe på det...

Hvilken samplingstid bruker du?

 

Hadde vært moro å lage en med PID regulering eller noe da, er jo moro å kunne bruke noe en har lært. Men den kommer nok etter bootloader og en del annet som er viktigere får å bedre funksjonaliteten...

Lenke til kommentar

 

å lage en diskret regulator som dette er jo fult mulig, men jeg har et problem og det er med hvordan jeg laga viftekontrollen... Jeg lager PWM til viftene i software (fordi jeg ville ha flere PWM kanaler enn den hadde i HW), men den bruker MYE CPU-tid på å lage denne PWMen (ca 2/3). Pga dette kan det hende at min T (samplingstid) blir for lang til at jeg kan lage en regulator som fungerer bra nok... men temperaturvariasjonene er jo ikke så raske så det trenger ikke være noe problem. Har ikke regna noe på det...

Hvilken samplingstid bruker du?

 

6285251[/snapback]

 

Software PWM høres ikke videre praktisk ut, ser for meg at du får store problemer med timingen når du skal kjøre andre tasks i tillegg.

 

har enda ikke fått målt dynamikken i systemet som skal kjøles, så vet ikke nøyaktig hvilken sampletid jeg ender opp på. Regner med det blir i størrelsesorden 100ms.

Lenke til kommentar
Software PWM høres ikke videre praktisk ut, ser for meg at du får store problemer med timingen når du skal kjøre andre tasks i tillegg.

6285447[/snapback]

 

Det er et mulig problem ja, i alle fall om jeg skal lage en diskret regulator kan det bli det. Foreløpig har jeg ikke dette problemet da alle ting som krever nøyaktig timing kjører på interrupts... og jeg har egentlig ikke noe som krever nøyaktig timing enda, bare hastighetsavlesing, men den er ikke kritisk for opperasjon en av kontrolleren

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...