1 / 12

Microcontroller Programmeren in C

Microcontroller Programmeren in C. MICPRG Les 8. Pulse input. Veel signalen in de buitenwereld zijn pulsvormig . Veel sensoren leveren een pulsvormig signaal: Tachometer (toerenteller) . Hartslagsensor. Snelheidsmeter (fietscomputer) . Foto-elektrische sensoren. Pedometer, enz...

kipling
Download Presentation

Microcontroller Programmeren in C

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Microcontroller Programmeren in C MICPRG Les 8

  2. Pulse input • Veel signalen in de buitenwereld zijn pulsvormig. • Veel sensoren leveren een pulsvormig signaal: • Tachometer (toerenteller). • Hartslagsensor. • Snelheidsmeter (fietscomputer). • Foto-elektrische sensoren. • Pedometer, enz... • Om de pulsduur te kunnen meten hebben veel µC’s een ingebouwde input capture unit.

  3. Meten van pulsduur • Algoritme: • Wacht tot ingang hoog wordt en reset Timer. • Wacht tot ingang laag wordt en lees Timer uit. • Tel indien nodig Timer overflows. • Pulsduur = (overflows*(MAX+1) + TCNT) * N / fclk • Waarom is dit niet zo’n goed idee? • Als je iets anders aan het doen bent kan het even duren voordat je in de gaten hebt dat ingang veranderd is. • Interrupt als ingang veranderd? • Beter maar: Als je ook andere interrupts gebruikt kan het nog steeds even duren voordat je kan reageren…

  4. Input capture unit • Timer/Counter1 van de ATmega32 heefteenspecialeInput Capture unit voor het meten van pulsduur. • Waarde van de TCNT1wordtgekopieerd in het ICR1(Input Capture Register 1) bij een bepaalde flank op pin IC1 = PD6.

  5. 15 0 Input capture 15 0 TCNT1 count-ingang 0x15C6 0x15C8 0x15C7 capture ICNC ICES 1 0x15C7 ICR1 0x0000 IC1PD6 Inputcontrol TIMER1_CAPT_vectinterrupt 0 1 TICIE0 =1 =0 ICF1

  6. Input capture • ICNC1 = Input CaptureNoiseCanceler 1 • 0 = Flank wordtmeteenherkend. • 1 = Flank wordt pas herkendalssignaal4 CPU klokperiodenstabiel is. • ICES1 = Input Capture Edge Select 1 • 0 = capture bij • 1 = capture bij • CS1x = Clock Select 1 • Instelbareprescaler 1, 8, 64, 256, 1024 Filtert HF stoorpulsenweg. Lageprescaler = hogenauwkeurigheid

  7. Meten van pulsduur • Toepassing: • Zend ultrasoon puls en ontvang reflectie • verschil = maat voor afstand. • Huiswerk: • Lees blz. 119 t/m 121 in het AVR boek (AT90S2313). • Schrijfeenprogrammaom de pulsduur van eenpositievepuls op pin PD6 temeten. Gegeven: • fCPU = 8 MHz. • 100 µs <= pulsduur <= 10000 µs. • Meting moet op 1 µs nauwkeurig zijn. • Programmahoeftverdernietstedoen. BijfCLK= 8 MHz nauwkeurigheid +/- 0,04 mm

  8. Pulse input • Veel signalen in de buitenwereld zijn pulsvormig. • Veel sensoren leveren een pulsvormig signaal: • Tachometer (toerenteller). • Hartslagsensor. • Snelheidsmeter (fietscomputer). • Foto-elektrische sensoren. • Pedometer, enz... • Om de pulsen te kunnen tellen hebben veel µC’s een ingebouwde counter.

  9. Timer/Counter0 • Counter: kies externeclockT0 = PB0. • Instellingen in TCCR0(Timer/Counter Control Register 0)

  10. R T/C0 overflow interrupt • T/C0 kan een interrupt genereren als TCNT0 overloopt. • Deze interrupt kun je aanzetten met het TOIE0 bit in het TIMSK register. 7 0 TCNT0 0xFF T0 = PB0 0x00 CS0=111 TIMER0_OVF_vectinterrupt 0 1 =1 TOIE0 =0 TOV0

  11. Tellen van pulsen 1 2 3 • Huiswerk: • Schrijf een programma dat telkens na 24 neergaande pulsen op pin PB0 een interrupt geeft (kratje vol).

  12. Uitwerking #include <avr/io.h> #include <stdint.h> #include <avr/interrupt.h> /* inverteer PB7 na 24 neergaande flanken op PB0 */ ISR(TIMER0_COMP_vect) { PORTB ^= 0x80; } int main(void) { TCCR0 = 0x0E; OCR0 = 23; TIMSK = 0x02; DDRB = 0x80; sei(); while (1); return 0; }

More Related