hjælp til servo kontrol med timer (Læst 57971x)

Offline jascore

  • Jordet Basic
  • **
  • Indlæg: 157
  • Antal brugbare Indlæg: 0
    • Vis profil
hjælp til servo kontrol med timer
« Dato: August 03, 2011, 16:56:27 »
Hej der.
Jeg er ved at lave et projekt, der kræver at en servo går fra 0 grader til 180 grader til 0 grader og kun én gang hver X time.
Jeg overvejer at bruge en 4060b til 0-24 timers timer (behøver ikke være mere præcis end +- 5 minutter) og en 555 til at kontrollere servoens bevægelse.
Når PIN 3 på 4060b trigger pin 2 på 555 skal servoen køre 1 cyklus 0 ->180 -> 0.

Jeg har et diagram for en 4060b timer og et for 555, men jeg kan ikke at servoen til kun at køre en cyklus.
Jeg overvejer at bruge en pic binary counter til at gøre arbejdet, men jeg har ingen erfaring med programmering af sådan en, og heller ikke et diagram

Håber i kan hjælpe mig
på forhånd tak
« Senest Redigeret: Maj 30, 2013, 18:18:08 af A5ive »

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: hjælp til servo kontrol med timer
« Svar #1 Dato: August 04, 2011, 23:03:20 »
Jeg overvejer at bruge en pic binary counter til at gøre arbejdet, men jeg har ingen erfaring med programmering af sådan en, og heller ikke et diagram.

Desværre ved jeg intet om servo, så der kan jeg ikke hjælpe ret meget.
Men jeg vil (personligt) anbefale en Atmel AVR til styring. Jeg synes de er meget lettere at arbejde med end PIC (du får sådan set også mere for pengene).
Du behøver ikke en timer kreds, hvis du bruger en microcontroller. AVR kan købes hos de fleste elektronik-forhandlere i Danmark (også El-Supply, selvom han ikke skilter så meget med det; ring evt. og spørg).
De fleste vælger at købe en Arduino, men hvis du ønsker det, behøver du faktisk kun selve AVR chippen, en 4k7 og en 100nF kondensator.
Hvis du ønsker høj eller præcis hastighed på microcontrolleren, kan du også koble et clock-krystal og 2 stk. 18pF kondensatorer på.

Selv den mindste AVR (har 3 ben) kan klare at styre en servo motor.
Jeg vil dog nok anbefale minimum en ATtiny85. Du kan få ATtiny fra omkring 10-12 kr. pr. stk.

Har du PC, kan du programmere den via parallel-porten og et hjemmelavet kabel. Har du en computer uden parallel-port, skal du nok have fat i fx. en AVRISPmkII (fx. gennem El-Supply).

Jeg har hørt at servo kan drille, men mange har lavet servo-styring med AVR, så bare vær tålmodig. :)

Vælger du AVR, kan du få adskillige værktøjer gratis. Har du PC, kan du bruge Atmel's egen udviklerpakke; har du Mac/Linux, kan du downloade avrdude + GCC. Med disse værktøjer kan du programmere chippen både i C og i assembler, hvis du synes.
« Senest Redigeret: Maj 30, 2013, 18:21:49 af A5ive »

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: hjælp til servo kontrol med timer
« Svar #2 Dato: August 04, 2011, 23:21:44 »
Hej der.
Jeg er ved at lave et projekt, der kræver at en servo går fra 0 grader til 180 grader til 0 grader og kun én gang hver X time.

Her er lidt mere information også omkring hvordan man kobler servoen til microcontrolleren.

Hvis nu din microcontroller kører på 8MHz (fx. den interne clock source), så vil du kunne sætte en timer op til at tælle, fx. hver gang der er gået 800000 clock-cycles, så tæller den 1/10 sekund ad gangen.
Når du så har talt 36000 af disse interrupts, er der gået en time.

Hvis du vil køre fra batteri, vil du nok også synes det er en god idé at bruge "sleep" kommandoen, hvilket får microcontrolleren til at køre 'langsomt' og derved spare strøm. Du vil så kunne 'vække' den, når den skal lave servo-sjov, og så sætte den til at sove igen bagefter.

Det kan forresten være en god idé at koble servo-motoren til et af microcontrolleren's PWM-ben eller timer-ben (OCxA/OCxB). Lad os antage at du har besluttet dig for at bruge en ATtiny85.
Først skal du vide noget om microcontrolleren. Gå derfor ind på dk.rs-online.com og skriv "attiny85" i søgefeltet. Der kommer så omkring 3 resultater. Der vil være én med ben på, som kan monteres i breadboard og hulprint. I den's række er der et PDF-ikon. Klik på denne. Der kommer nu en boks frem med tekniske referencer. Klik på "8-bit Microcontroller with 2/4/8K Bytes In-System Programmable Flash Data Sheet".
Gem dette datablad på din harddisk, så du senere kan hente det frem nemt.
Åbner du PDF'en, vil du kunne bladre til side 2, hvor du ser benforbindelserne på chippen.
Her ser du bla. 2 ben der har 'OC1B' i navnet. Forskellen er at den ene har en streg over OC1B, hvilket betyder at den er inverteret i forhold til OC1B.
Men samtidig ligger disse ben på XTAL1 og XTAL2. Hvis du nu vil bruge eksternt clock-krystal, vil det være en god idé at holde de 2 ben frie.
I stedet vil du nok foretrække at bruge PB0 til servo-styringen Den har OC0A. Der er også PB1, som har OC0B.
Hold RESET-benet fri. Dette skal du koble til en pull-up modstand på mellem 4k7 og 10k; fx. en 4k7 modstand fra RESET-ben til +5V. Ved VCC benet sætter du en 100nF kondensator som du plejer ved alle IC'er, for at undgå støj-påvirkninger.
« Senest Redigeret: August 04, 2011, 23:37:09 af pacman »

 

Offline jascore

  • Jordet Basic
  • **
  • Indlæg: 157
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: hjælp til servo kontrol med timer
« Svar #3 Dato: August 05, 2011, 23:33:13 »
Tusind tak for dit svar pacman.
Det jeg skal lave er et doserings system til saltvandsakvarie. Meningen er at en servo skal trække en sprøjte ud til X antal milimeter og derefter sprøjte det i akvariet. alt det mekanik tekniske er lavet mangler bare at lave styrringen.
Der er nogle få krav bla at det skal være nemt og hurtigt for enhver at ændre mængden så min løsning er i prototypen at lave følgende.
1 4001 ,pr væske der skal leveres, der fungerer som multivibrator med en variabel modstand til at ændre frekvensen til servoen og derved bestemme hvilken position den skal køre frem til (x antal ml)
og så en 4001 kreds til at trykke alle sprøjter i bund og leverer væsken, også med variabel modstand til at justerer hvor bunden er alt efter sprøjte størrelse.
hver sprøjte skal styres af en alt digital on/off timer så man kan stille hvornår og hvor mange gange i døgnet væsken skal tilføres.

mit problem lige nu er som følger.
Har en alm digital timer der kan programeres til 1 minut. Det skal leverer strøm til en anden timer som kan tænde et rælæ vente vente 20 sek. og slukke vente et par sek og så tænde et andet relæ i 20 sek. for derefter at slukke.

De to relæer leverer strøm til henholdsvis den ene og den anden 4001

Det er sammenlagt 42 sek men der kommer strøm fra den alm timer i 1 minut så det er vigtigt at efter at relæ nr 2 er slukket at det ikke køre i loop.
Jeg er elektrikker og kunne nok klare det med alm relæ teknik men det skal jo helst fylde så lidt som muligt, derfor har jeg bevæget mig usikkert ind på svagstrøms området og takker de højere magter for internettet :-P.

Jeg tænker jeg kan gøre det med noget flip flop A B men mit problem er at det kun skal ske 1 gang indtil styrestrømmen slukkes og den skal reset og sår styrestrømmen tænder igen skal den køre A B en gang osv osv




« Senest Redigeret: August 06, 2011, 00:49:06 af jascore »

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: hjælp til servo kontrol med timer
« Svar #4 Dato: August 06, 2011, 00:48:39 »
...mangler bare at lave styrringen...
...nemt og hurtigt for enhver...
...et potmeter til at ændre frekvensen til servoen...
...4001 kreds...
...potmeter til at justerer hvor bunden er alt efter sprøjte størrelse...
...hver sprøjte styres af en digital on/off timer...
...tænde et rælæ vente vente...
...tænde et andet relæ...
det skal jo helst fylde så lidt som muligt...

Alt ovenstående kan programmeres ind i en microcontroller.
Hvis det skal fylde så lidt som muligt, vil jeg absolut anbefale en microcontroller. :)
En sådan microcontroller kan fåes ned i 4mm x 4mm (lige netop dén størrelse er ikke sjov at lodde i hånden)

Men for de mere almindelige mennesker er en ATtiny44A-20PU nok liige sagen.
Her er lidt af hvad du kan med den:
Den inkluderer alt hvad CD4001 kan plus mere, både at den kan tænde og slukke for ben, plus de logiske funktioner.
Den har 12 i/o ben. i/o betyder at man enten kan aflæse fx. en kontakt eller med programmet tænde/slukke benet.
Ud af de 12 i/o ben, kan 8 af dem bruges til analog aflæsning (dvs. 0 til 2,56Vdc; opdelt i enten 256 eller 1024 værdier)
Den har 2 uafhængige timere. Dvs. 1 timer kan sagtens gøre flere ting på én gang, så du behøver kun at bruge en enkelt timer.

Skal du tænde/slukke et relæ (fx. 250V/10A), kan du nøjes med at sætte en 1K modstand fra microcontrolleren til basis på en BC547 transistor. Emitter sætter du til GND, mens collector sættes til relæet og relæet til +5V. Du sætter så en 1N4148 fra +5V til collector, for at beskytte transistoren mod transienter (kendt opstilling).

dette (stjålne) billede, kan du se et "Control circuit". Det ben der står "uC+bluetooth" på, svarer til microcontroller-benet. Som modstand anbefaler jeg en 1K; det har jeg altid selv brugt uden bøvl. Transistoren kan være fx. en BC546...BC548, alt efter hvad du har i skuffen. Relæet kan du evt. spørge Danni Hansen om. ;)
Dioden er en 1N4148.
Spændingen kan være fra 5V til 12V, alt efter hvad relæet kræver, op til hvad transistoren kan klare. (Så vidt jeg husker i hovedet: BC546 klarer 65V, BC547 klarer 45V).
-Men det err nok bedst at holde den på 12V eller under.

OK, hvad har vi nu?

1: Microcontroller styring med timer funktion, hvor du kan vælge at køre i få mikrosekunder op til så mange år som du har lyst til.
2: Tilkobling af 2 potmetre (skulle det blive nødvendigt, kan der kobles flere på)
3: Tænd/Sluk af relæer
4: Styring af Servo-motor. (Brug fx. PA6, PA7, PB2 eller PA5 til servo-motoren)

Følgende komponenter er så nødvendige:
Selve styringen:
ATtiny44A
100nF kondensator
4k7 modstand til at forbinde fra RESET til +5V.
En Transformer - Fx. 2x6V til et 5V kredsløb.

Strømforsyning:
7805 spændings-regulator
47uF/25V kondensator (2 stk, en før, og en efter din 7805)
Evt. Diodebro

Per potmeter:
én modstand med samme værdi som potmetret; fx. 1K eller 5k vil nok være et godt valg.

Per relæ:
BC546
1K modstand mellem microcontroller og Basis på transistor
1N4148 til at sætte over relæet fra +5V/+12V til Collector på transistor.
(og så selve relæet; regn med cirka 10-30 kr. ex. moms, alt efter hvilken type du vælger)

Potmeter sætter du så i serie med en modstand, fx:
Fra +5V sættes en 1K modstand til det ene yderben på et 1K potmeter. Det andet yderben sættes på 0V. Midterbenet (udtræk) sættes direkte ind på et af microcontrolleren's ADC ben. Her kan du så måle 5V/2 = 0V til 2.5V. Simpelt og nemt, ikke ?
-Du skal bare vælge en modstand med samme værdi som potmetret, fx. en 5K modstand til et 5K potmeter, osv; for så divideres spændingen med 2.

Skal du have kontakter eller tryk-knapper på, sætter du en 4k7 modstand fra det valgte i/o ben op til +5V. Fra samme i/o-ben sætter du så din trykknap/kontakt til 0V, så når knappen er trykket ned, går der 0V direkte ind på benet; når knappen er sluppet, går der +5V igennem modstanden ind på i/o benet, nemt, ikke?
(Du kan også lave det omvendt, hvis du synes det er lettere at finde rundt i.)

Derudover... Programmerings-muligheder til din Microcontroller. Du kan fx. sætte den i sokkel på printet, og så programmere den før du propper den i; eller du kan lave et programmerings-stik i dit print, og programmere hver microcontroller mens den sidder i printet med strøm på.
Som programmerings-stik kan man bruge en alm. 2.54mm spacing "Header" -disse kan "klippes/skæres" i mindre bidder. Du har brug for en 2x3, så ud af 2x40 kan der blive 13, når du har øvet dig i at skære dem i et par minutter; først lidt ned i den ene side, derefter i den anden side, ellers sprækker/knækker de forkert. ;)

Resten er ligetil. På ovenstående stjålne billede er vist en strømforsyning; denne er god nok til både 12V og 5V. Skal du bruge 5V, skal du udskifte 7812 med 7805.
Bemærk: Microcontrolleren kan køre på 1.8V til 5V, så giv den ikke mere end 5V, da den ellers brænder af.
(N)y (B)emærkning: Du burde ikke behøve relæer til dit projekt. Så vidt jeg har forstået, kan servo-motoren sættes direkte til microcontrolleren.
Relæ-komponenterne er bare inkluderet, siden du er elektrikker og nok en dag vil få lyst til at have kaffen klar når du står op om morgenen, eller lign. ;)
-Og så selvfølgelig til de forbipasserende, der netop har brug for at tænde/slukke relæer.
« Senest Redigeret: August 06, 2011, 01:00:55 af pacman »

 

Offline jascore

  • Jordet Basic
  • **
  • Indlæg: 157
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: hjælp til servo kontrol med timer
« Svar #5 Dato: August 06, 2011, 01:02:24 »
tusind tak
ok prøver at lave et diagram og smider op jeg er jo temmelig grøn i det svagstrømsske univers men kan godt se logikken så prøver lige.

 

Offline jascore

  • Jordet Basic
  • **
  • Indlæg: 157
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: hjælp til servo kontrol med timer
« Svar #6 Dato: August 06, 2011, 03:44:44 »
kan godt se at det bliver lidt mere besværligt end jeg troede.
Kan finde eksempler på servocontroller ved brug af ATTiny2313 og jeg kan nogenlunde c++ programering så jeg finder nok ud af det.
men kan jeg overføre principperne fra ATTiny2313 til 44'ern når de alle er 8 bit ?

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: hjælp til servo kontrol med timer
« Svar #7 Dato: August 06, 2011, 04:54:57 »
kan godt se at det bliver lidt mere besværligt end jeg troede.

Nu har du ihvertfald en mulighed for lidt hjælp herfra, så det skulle gerne lette det en del. ;)

Kan finde eksempler på servocontroller ved brug af ATTiny2313 og jeg kan nogenlunde c++ programering så jeg finder nok ud af det.

Hvis du kan C++, kan du også C. Der bruges ikke C++ i AVR, idét C++ er alt for kæmpestort til de små microcontrollere.

men kan jeg overføre principperne fra ATTiny2313 til 44'ern når de alle er 8 bit ?

Lige præcis. AVR er instruktions-sæt-typen. Dvs. de kan alle forstå samme assembler instruktioner.
Der er dog få variationer mellem nogle af chip-typerne, men de fleste ATtiny bruger samme instruktioner.
Nogle af IC'erne kan endda dele samme binære filer, men det er ikke altid tilfældet, for addresser på fx. I/O-porte kan være anderledes.

Skriver du koden i C, så vil du ikke behøve bekymre dig ret meget. Det hele checkes stort set når der compiles. Du skal bare sørge for at din CPU-frekvens i din Makefile er korrekt, og at din DEVICE er korrekt (fx. attiny44)

Nu må jeg selvfølgelig ikke glemme at Timere, ADC og PWM også sættes forskelligt op på mange microcontrollere.
Fx. har ATtiny2313 ingen ADC. Den har en comparator, hvilket er en mere skrabet 'fattigmands ADC'.

Jeg vil anbefale dig at lave 3-4 forskellige source-filer...
1: main.c + main.h
2: ADC.c + ADC.h
3: Timer.c + Timer.h
4: Servo.c + Servo.h

main.c kunne se nogenlunde sådan ud:

Kode:
#include <avr/io.h>

#include "main.h"
#include "ADC.h"
#include "Timer.h"
#include "Servo.h"

void init()
{
  cli(); /* disable all interrupts */
  initADC();
  initTimer();
  initServo();
  sei();  /* enable interrupts */
}

int main()
{
  DDRA = 0xff;  /* all outputs */
  DDRB = 0xff;  /* all outputs */
  PORTA = 0xff; /* all high */
  PORTB = 0xff; /* all high */
  init();
  while(1) /* loop forever; everything is handled by interrupts */
  {
  }
  return(0);
}
...Så kunne de andre filer indeholde specifikke opgaver i deres område.

I ATtiny44's fulde datablad kan du se hvordan Timer, ADC og PWM sættes op.
Tag én ting ad gangen, ellers bliver det for overvældende; dette er også grunden til jeg foreslår at dele filerne op i 4 bidder.

Aflæsning af ADC bør gøres via en funktion; dette vil jeg komme tilbage til senere.

En timer-interrupt funktion kunne se således ud (trigger på Timer-overflow):
Kode:
/* Timer.h */

/* Accessor functions; you may find these useful... */
uint8_t getHz10000();
void setEvent1CountDown(uint16_t aCountDown);
void setEvent2CountDown(uint16_t aCountDown);

/* external functions; you must implement these... */
void handleEvent1();
void handleEvent2();

Kode:
#include <avr/io.h>
#include <avr/interrupt.h>

static volatile uint16_t hz10000 = 0; /* *must* be volatile! */
static volatile uint8_t hz100 = 0;
static volatile uint8_t hz1 = 0;
static volatile uint8_t minutes = 0;
static volatile uint8_t hours = 0;
static volatile uint16_t event1CountDown = 0;
static volatile uint16_t event2CountDown = 0;

uint16_t getHz10000() /* accessor-function */
{
  uint16_t result;

  result = hz10000; /* read value */
  if(0x00 == (result & 0xff)) /* value just wrapped, make sure we read it properly */
  {
    result = hz10000; /* read value again; this is the fastest way to do it safely */
  }
  return(result);
}

void setEvent1CountDown(uint16_t aCountDown)
{
  event1CountDown = aCountDown;
}

void setEvent2CountDown(uint16_t aCountDown)
{
  event2CountDown = aCountDown;
}

SIGNAL (SIG_OVERFLOW0)
{
  static uint8_t hz100counter = 0;
  static uint8_t hz1counter = 0;
  static uint8_t minuteCounter = 0;

  /* ATtiny24/44/84 Preliminary, page 83; section 11.9.3 */
  TCNT0 = 256 - ((uint8_t) ((F_CPU / 8) / 10000)); /* intterupt occurs 10000 times per second */

  /* we get here 10000 times per second. */
  hz10000++;   /* increment counter */

  /* let's have a 100 Hz counter, a 1 Hz counter and a 1-minute counter... */

  if(0 == hz100counter--)
  {
    /* we get here 100 times per second. */
    hz100counter = 100 - 1;  /* restart countdown */
    hz100++;  /* increment counter */
    if(0 == hz1counter--)
    {
      hz1counter = 100 - 1;  /* restart countdown */
      hz1++;  /* increment counter */
      if(0 == minuteCounter--)
      {
        /* we get here once every minute */
        minuteCounter = 60 - 1; /* restart countdown */
        minutes++;  /* increment counter */
        if(minutes >= 60)
        {
          minutes = 0;
          hours++;
        }
        if(event1CountDown && 0 == event1CountDown) /* if nonzero, count down until it's zero */
        {
          handleEvent1();
        }
        if(event2CountDown && 0 == event2CountDown) /* if nonzero, count down until it's zero */
        {
          handleEvent2();
        }
      }
    }
  }
}

void initTimer()
{
  cli(); /* disable interrupts if not already done */

  /* clear our counter variables: */
  hz10000 = 0;
  hz100 = 0;
  hz1 = 0;
  minutes = 0;
  hours = 0;

  /* ATtiny24/44/84 Preliminary, page 83; section 11.9.6 */
  cbi(TIMSK0, TOIE0); /* clear 'Timer Overflow Interrupt Enable 0' bit in 'Timer Interrupt MaSK 0' */

  /* set up timer to run in normal mode: (WGM02:WGM01:WGM00 = 000 */
  /* make timer use PRESCALER8: (CS02:CS01:CS00 = 000): */

  /* ATtiny24/44/84 Preliminary, page 79; section 11.9.1 */
  TCCR0A = (0 | (0 << COM0A1) | (0 << COM0A0) | (0 << COM0B1) | (0 << COM0B0) | (0 << WGM01) | (0 << WGM00));

  /* ATtiny24/44/84 Preliminary, page 82; section 11.9.2 */
  TCCR0B = (0 | (0 << FOC0A) | (0 << FOC0B) | (0 << WGM02) | (0 << CS02) | (1 << CS01) | (0 << CS00));

  /* Clear any pending interrupts, so we don't get an accidental interrupt immediately after enabling interrupts... */
  /* ATtiny24/44/84 Preliminary, page 84; section 11.9.7 */
  sbi(TIFR0, TOV0); /* clear 'Timer OVerflow 0' bit in 'Timer Interrupt Flag Register 0' */

  /* enable Timer OVerflow 0 interrupt: */
  /* ATtiny24/44/84 Preliminary, page 83; section 11.9.6 */
  sbi(TIMSK0, TOIE0); /* set 'Timer Overflow Interrupt Enable 0' bit in 'Timer Interrupt MaSK 0' */
}

-Ja, jeg har lavet kommentarerne på engelsk, for jeg kan ikke holde ud at der står danske kommentarer i engelsk kode. ;)

Timer-funktionen kalder her 2 funktioner, når event1CountDown og event2CountDown tæller ned til 0.
Hvis tællerne allerede er 0, foretages intet; men når fx. event1CountDown går fra værdi 1 til 0, vil handleEvent1() funktionen blive kaldt.
Denne funktion kan du så lave noget kode i, som bliver udført efter fx. 30 minutter når event1CountDown er sat til 30.
Der tillades så her helt op til 65535 minutter, hvilket er 45 dage. =)
Er dette 'for lang tid' eller 'for upræcist'; fx. hvis du vil have sekunder i stedet for minutter, kan du bare flytte de 2 funktions-kald med tilhørende 'if' op, så de står lige under 'hz1++';

Koden er ikke testet på en ATtiny44, der er muligvis nogle fejl, men grund-princippet virker; jeg bruger det ofte på andre ATtiny'er. Jeg har sådan set et par ATtiny44 på vej hertil, så jeg kommer nok snart til at afprøve det, da jeg skal bruge tilsvarende kode på en 44'er selv.

 

Offline jascore

  • Jordet Basic
  • **
  • Indlæg: 157
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: hjælp til servo kontrol med timer
« Svar #8 Dato: August 06, 2011, 16:22:32 »
Puha føler mig godt nok usikker men vil det her virke baseret på en 44 ?
det skal helst være sådan at systemet kan konfigureres fra 1 til X antal doseringsenheder derfor er udgangspunktet 1 kreds pr enhed men der kan vel sluttes et par mere på hvis det skulle være nødvendigt
Og hov der skal ikke stå pa1 pen pa10

« Senest Redigeret: August 06, 2011, 19:29:15 af jascore »

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: hjælp til servo kontrol med timer
« Svar #9 Dato: August 06, 2011, 19:30:12 »
Puha føler mig godt nok usikker men vil det her virke baseret på en 44 ?

Liige næsten.
Husk at sætte C3 så tæt på IC'ens VCC ben (dvs. ben 1) som muligt; jaja, altså om det er 5 mm væk eller 10mm, det går nok i dette tilfælde; men det er en god vane at sætte den lige op ad.

Jeg har følgende forslag til ændringer...
Nu bruger du et 50K potmeter, så bør du også sætte en 50K modstand mellem potmetret's plus-ben og VCC; dette giver dig lidt bedre kontrol i software, plus at du får 0.0V-2.5V ind på benet. For hvis du får over 2.56V ind på dit ADC ben, vil den bare sige "max", så du kan ikke kende forskel på 3V og 5V. Kommer der mere end 5V ind, kan du risikere at ADC-benet (eller micro'en) brænder af.

Jeg vil derudover anbefale at du sætter impuls til servo på et af følgende ben:
PB2 (ben 5), PA5 (ben 8), PA6 (ben 7) eller PA7 (ben 6).
Dette er fordi du så kan sætte en PWM kanal op til at give den præcise frekvens til din servo motor.
Vælger du at bruge PA5 eller PA6, kan du opnå en meget fin frekvens-kontrol (16-bits præcision), mens PB2 og PA7 'kun' har 8-bit præcision.
Jeg valgte i tidligere kode-eksempel, at bruge 8-bit timeren (Timer0), som har PWM kanal på PB2 og PA7, fordi så har du lidt friere hænder til at bruge den mere præcise timer til PWM.

Der kan opstå lidt bøvl ved at styre med at tænde/slukke for en strømforsyning.
Mange strømforsyninger har indbyggede kondensatorer. En microcontroller som AVR, bruger ikke ret meget strøm, og derfor vil den ikke lige tømme kondensatoren (som jo virker som batteri) med det samme. Der kan måske gå flere uger, før den er tømt, alt efter kondensatorens størrelse.

Dette er dog en opgave, der kan løses, fx. med en opto-coupler på primærsiden af en transformator, eller ved at sætte nogle komponenter ind, som sluger masser af strøm.

Hvis du alligevel vil bruge tænd/sluk som en one-shot trigger, vil du nok også skulle bruge en Reset-kreds med tilhørende modstande/kondensatorer. Dette behøver du dog nok ikke tænke på til prototypen.

Til de første tests kan du selvfølgelig gå lidt udenom at programmere PWM med timer, men når du har fået det grundlæggende til at fungere, så vil du nok foretrække at det kører med en PWM-timer, da det er mere stabilt.

Ben 4 bør du sætte en 4k7 modstand på. Den anden ende af modstanden bør sættes til +5V.

Det er en god idé med C1 og C2. Det stabiliserer din aflæsning af potmetret og du undgår derved det værste prel (prel=kort forklaret: 'støj', når man rører potmetret; dette findes også på tryk-knapper/kontakter). Det kan lade sig gøre at filtrere prel ud i softwaren, ved at lave fx. 16 målinger og så tage gennemsnittet. Dette kan gøres over fx. 100 millisekunder, så det vil stadig føles som om enheden reagerer straks man drejer på potmetret. Det kan også løses på en mere korrekt måde: At man sammenligner de sidste fx. 4 målinger (over 20 millisekunder), og ser om de er nogenlunde ens (+/- 3%); er de det, kan man godt stole på aflæsningen. Dette kan vi komme ind på senere, når der bliver behov for det.

Yderligere hints:
For at programmere IC'en, bruges følgende ben:
1: VCC
4: RESET
7: MOSI
8: MISO
9: SCK (her kaldet USCK)
14: GND

Det kan være godt at downloade og gemme denne PDF; for på side 26 kan du se hvordan man forbinder atmel's AVRISPmkII USB programmerings-enhed til microcontrolleren. Dette er det 6-polede stik jeg tidligere omtalte. Mange andre programmerings-enheder bruger samme type stik. Nogle bruger dog et 10-polet stik; det er en lidt ældre type programmerings-enhed, for kun 6 ben er nødvendige.

Når du skal til at sætte det i produktion, så husk at alle komponenter skal overholde RoHS direktivet (dette er lovkrav); dette kan jeg godt hjælpe med, når du er klar.

 

Offline jascore

  • Jordet Basic
  • **
  • Indlæg: 157
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: hjælp til servo kontrol med timer
« Svar #10 Dato: August 06, 2011, 21:38:43 »
Oki. her er så en redigeret udgave
ved ikke om d1 og d2 er nødvendige når benene på 44'ern bruges af 2 komponenter men min logik siger mig at de vil forhindre at der bliver sendt "baglens" signaler

Grunden til at jeg prøver at fastholde de digitale on off ure er at jeg ellers vil være nød til at sætte et display på systemet hvor timer funktioner kan styres, med tilhørende knapper og garanteret også en hel del mere kode. Nogle akvarier skal have nogle doser flere gange i døgnet og andre vil kunne bruge doseringssystemet til at fodre f.eks plankton op til 6 gange i døgnet. Jeg kunne jo selvfølgelig lave et user interface på pc og så kunne almendelige mennesker bruge det når de ville sætte timer op. men jeg kan heller ikke gå ud fra at de har en pc i nærheden af deres akvarie. desuden skal omkostningerne holdes nede for det er netop for at give os fattigrøve mulighed for at have et doseringsanlæg som ellers nemt koster 1000 pr kanal. en digital timer kan erhverves for omkring 50 kr og det kan jeg garanteret ikke gøre det for hvis jeg selv skal smide et display på, men ved det ikke, har ikke tjekket priser ud endnu.

« Senest Redigeret: August 06, 2011, 22:09:36 af jascore »

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: hjælp til servo kontrol med timer
« Svar #11 Dato: August 06, 2011, 22:38:04 »
Oki. her er så en redigeret udgave
ved ikke om d1 og d2 er nødvendige når benene på 44'ern bruges af 2 komponenter men min logik siger mig at de vil forhindre at der bliver sendt "baglens" signaler

Du er der næsten. :)

D1 og D2 er ikke gode at have i dette tilfælde.
En diode 'spiser' 0.7V (+/- 0.1V alt efter hvad temperatur der er), hvilket vil sige at dine målinger først begynder, når potmetret er skruet godt op.
Du skal have 2 stk 50K modstande i alt; en for hvert potmeter.
R3 skal flyttes om på venstre side af den lodrette forbindelse, dvs. mellem R2's top-ben og +5V.
Den ekstra modstand kan vi kalde R5; denne skal så sidde fra hvor 4k7 sidder på +5V og ned til R1's top-ben.

Dvs. hvert potmeter skal have en 50k modstand i serie på +5V siden.

Programmerings-stikket's ben 5 (RESET) er sat til IC'ens ben 3; den skulle sættes til ben 4 (dvs. direkte på benet, hvor 4k7 modstanden også er sat på; den skal altså mødes med både benet og 4k7)


Bortset fra det, ser det rimelig fornuftigt ud. :)

Citér
Grunden til at jeg prøver at fastholde de digitale on off ure er at jeg ellers vil være nød til at sætte et display på systemet hvor timer funktioner kan styres, med tilhørende knapper og garanteret også en hel del mere kode. en digital timer kan erhverves for omkring 50 kr og det kan jeg garanteret ikke gøre det for hvis jeg selv skal smide et display på, men ved det ikke, har ikke tjekket priser ud endnu.

Næ, det kan du have ret i. -Ellers har du nok brug for flere ben-forbindelser (hvis det skulle være et display med både tal og bogstaver). Koreanerne, Kineserne (og folk fra Taiwan) kan dog også lave displays efter dine designs; der er noget med at man bare kan sende dem en PDF fil, så laver de et display der kan vise de tegn som PDF'en viser.
Se fx. Customized LCD module hos Winstar.
Her er et par andre idéer: LXD i USA/Kina, OrientDisplay i USA, Dongfu i Kina, og mange andre (men pas på, for der kan være banditter. Ser hjemmesiden ikke 100% professionel ud; med billeder af deres egne displays, eller står der AliExpress/Alibaba et eller andet sted, så gå langt udenom - for de snyder og du får enten et plastic-kort eller en gammel hullet sko i stedet for hvad du bestilte hos dem) - og så befinder de sig normalt i Nigeria, ikke i Kina.
« Senest Redigeret: August 08, 2011, 04:09:25 af pacman »

 

Offline jascore

  • Jordet Basic
  • **
  • Indlæg: 157
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: hjælp til servo kontrol med timer
« Svar #12 Dato: August 06, 2011, 23:30:05 »
Mange tak for din tålmodighed. jeg har jo ikke lavet noget svagstrøm siden grundforløbet he he.

Har lavet de rettelser du skrev. vil lige spørge om det vil være nok at sætte en modstand og en 4 volt lysdiode ind i starten af diagrammet, vil det være nok til at aflade kondensator fra strømforsyningen?

Hvor er det lettest og billigst at bestille komponenter, og kan det betale sig at lave sit eget print frem for el hulprint. (bruger bare hulprint her i prototypen, men senere. ved jo heller ikke lige om der er lovkrav i forhold til det.

Endnu en gang tusind tak for hjælpen.
hvis det er ok vil jeg tillade mig at skrive til dig når det kommer til programeringen. begynder så småt at læse lidt om det og ser på dine eksempler.

 ;D


 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: hjælp til servo kontrol med timer
« Svar #13 Dato: August 07, 2011, 00:49:33 »
Mange tak for din tålmodighed. jeg har jo ikke lavet noget svagstrøm siden grundforløbet he he.

Jeg synes nu du klarer dig ganske fint. :)

Citér
Har lavet de rettelser du skrev. vil lige spørge om det vil være nok at sætte en modstand og en 4 volt lysdiode ind i starten af diagrammet, vil det være nok til at aflade kondensator fra strømforsyningen?

De fleste lysdioder er på 3V/20mA. En 100 ohm modstand i serie med en sådan vil aflade de fleste strømforsyninger i løbet af nogle sekunder; men det kommer igen an på størrelsen af den kondensator der sidder på strømforsyningen.

Citér
Hvor er det lettest og billigst at bestille komponenter, og kan det betale sig at lave sit eget print frem for el hulprint. (bruger bare hulprint her i prototypen, men senere. ved jo heller ikke lige om der er lovkrav i forhold til det.

Til produktion, bruger jeg selv RS. Dette skyldes at deres priser er rimelig fornuftige, og at man kan se om de ting man bestiller er i overensstemmelse med RoHS direktivet. Derudover har RS en afdeling i Danmark.
De fleste komponenter skulle du have mulighed for at få iløbet af 3-4 dage; der kan dog være leveringstid på nogle komponenter. Men så længe du holder dig til standard-komponenter, så er der kort leveringstid.

Jeg vil anbefale at lave print i SMD. Det fylder ganske lidt, og komponenterne er ofte billigere.
Prisen afhænger også af størrelsen på printet; derfor er SMD oftest at foretrække.

Lad os antage at du vil lave ovenstående i SMD, så kan du bruge...
ATtiny44-20SSSU (bemærk: billedet er forkert, det er en Small Outline Integrated Circuit kreds med 14 ben; benafstanden er 1.27mm hvilket vil sige at den er mulig at lodde i hånden uden for meget besvær).
Af modstande bruger jeg selv 0603 størrelsen.
Af keramiske kondensatorer bruger jeg også 0603 størrelsen.
De fleste vil nok foretrække 1206 eller 0805, da de er lidt lettere at placere/holde på (med speciel SMD-pincet) mens der loddes.
Størrelser:
0603: 1.6mm x 0.8mm
0805: 2.0mm x 1.3mm
1206: 3.2mm x 1.6mm

Til lodning af SMD bør man bruge minimum en Weller WS81 med variabel temperatur og termostat (absolut ikke en 'loddekolbe på ledning'!) og så en god loddetin med 96.5% tin og 3% fluss; MBO er et fornuftigt valg.

Printet burde nemt kunne fylde 1cm x 2.5cm i dit tilfælde (potmetre er ikke medregnet, da de nok vil sidde i et chassis), hvis man bruger 0603 og en SOIC14 ATtiny; det kan også laves mindre, men om det skulle være nødvendigt, ved jeg ikke.

Normalt koster et print minimum 225 kr. excl. fragt og moms, men i tilfælde af at printet er 1.5cm x 2.5cm, tror jeg, at jeg kan få ovenstående SMD print for 20 kr/stk. ved køb af 16, eller 15 kr/stk. ved køb af 80 (priser er ex. moms).

Ved større produktioner, fx. 1000 print ad gangen, burde de kunne fåes billigere.

Prototypen kan du sagtens lave på et Vero board, eller breadboard.

Bestiller du komponenter gennem RS, skal du være opmærksom på at der er 85 kr. i fragt (ex. moms), hvis du køber for under 500 kr; overstiger vareværdien 500 kr. ex. moms, får du gratis fragt.
Hvis beløbet ikke kommer derop, kan du spørge El-Supply om han kan skaffe de komponenter du har brug for; jeg tror det kan betale sig i dit tilfælde.

Bor du i København, eller kommer du dertil, kan du gå ind i RS-butikken og købe komponenterne dér. Jeg har ikke selv prøvet dette, og ved ikke om man skal bestille i forvejen, men har på fornemmelsen at man kan få varerne et kvarter efter man har bestilt, og så skal man jo ikke betale fragt.

-Ellers kan jeg godt tage dem med i købet, når jeg alligevel bestiller fra RS, så behøver du kun betale porto for brev. Sådan set kunne jeg også montere de få komponenter på et vero-board for 100 kr, hvis det har interesse. (Min normale timeløn er 150 til 250 kr alt efter opgavetype, men vi skal lige have dig igang.)
Prisen pr. leaded modstand/keramisk kondensator vil så være 50 øre, og for en 13 kr for en ATtiny44, 7 kr. for en sokkel til ATtiny44, 1 kr pr. lysdiode, 50 øre for det 2x3 polede stik og uhm ca. 10 kr. for 1/3 vero-board (jeg bruger dem der har 3 sammenhængende øer), 5 kr. per skrueterminal med 2 skruer, 8 kr for et DC-stik.
Dvs. for ovenstående (testet) og incl. 'en yellow amber' lysdiode: 53 kr + 100 i arbejdsløn = 153 kr ex. moms og porto på 8 kr. oveni - konvolut er gratis. ;)
Således vil det være muligt, hvis du har en 5VDC strømforsyning, at koble den på printet. Det kan være at det er mest praktisk at bruge en skrue-terminal, for ikke alle DC strømforsyninger har + i midten og GND på yder-ringen. -Dette bør du lige måle med et multimeter, inden du sætter den til.
-Men du er ikke tvunget til at bruge mig; for jeg vil ikke tage nørde-fornøjelsen fra dig - jeg er klar over at det også er sjovt at sætte komponenterne sammen selv, især hvis du vil ændre noget undervejs. :)

Citér
Hvis det er ok vil jeg tillade mig at skrive til dig når det kommer til programeringen. begynder så småt at læse lidt om det og ser på dine eksempler.

Helt klart; ingen problemer. ;)

 

Offline jascore

  • Jordet Basic
  • **
  • Indlæg: 157
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: hjælp til servo kontrol med timer
« Svar #14 Dato: August 08, 2011, 01:36:43 »
Jeg tror lige jeg beholder nørde glæden her i starten men tusind tak for tilbudet. kan godt være jeg benytter mig af det hvis fingrene sidder forkert.

prototyen tror jeg jeg holder i standard "store" komponenter og alm hul kort.

lige et sidste spørgsmål inden jeg i morgen begynder.
Vil det med nuværende 44 være muligt at smide et display på der viser antal ml.
det er jo bare værdien fra pot, med 1 decimal der skal vises ud fra en eller anden formel der omregner pot værdi så antal grader på servo stemmer med antal ml der trækkes ind i sprøjten. et sådan minidisplay kan vel ikke koste al verden