Ik heb een schakeling nodig die een spanning van een sensor die kan varieren tussen 2.5V en 2.9V omzet naar een puls van constante breedte (1ms) maar varierende herhalingstijd. Met dien verstande dat bij 2.5V er geen puls komt. Herhalingstijd oneindig dus.Bij 2.9V zou de herhalingstijd ongeveer 250ms moeten zijn.Lineair verband.

In zekere zin wel, maar deze moet vanaf 0Hz beginnnen.

Ik dacht zelf aan een teller die Spannings-afhankelijk telt , van stilstaan tot snel , en bij een bepaalde waarde in de teller de puls stuurt en zichzelf terug reset.

[Bericht gewijzigd door Evarist op ]

Men neme een ATtiny13 en...
Dat is, denk ik, niet wat je in gedachten hebt. Maar toch, als je met 1 8-pins IC kan doen wat je wil?

Ik ken geen ATtiny13, is dat een PIC?

Neen, een tegenhanger, een AVR.
Maar in een 8-pins PIC met A/D kan het natuurlijk ook.
12F675 bijvoorbeeld.

[Bericht gewijzigd door Pieterjan V. op ]

Een type waar ze bij AAVRS 1.08 euro voor vragen. De prijs van een vergelijkbare pic zal wel in die buurt liggen.

gebruik een 555 (gebruik dit programma om de pulslengte in te stellen)

Met 2 stuks 555 kan je ook wat doen: de eerste als astabiele multivibrator, die de tweede (als monoflop geschakeld) aandrijft.
Maar om daarmee aan de eisen, die evarist stelt, te voldoen? Dat zal niet meevallen...

Ik ben niet zo erg thuis in Pics en AVRs. Ik zou nog eerst moeten leren programmeren. Tenzij iemand van jullie me daarmee wil helpen.Maar jullie hebben me een paar ideeen gegeven. Ik broed er even op door en laat zeker weten wat er uit de bus komt.
Hartelijk dank voor jullie reacties.

Pros, hoe kan ik die eerste 555 schakelen, dat begrijp ik nog even niet.

[Bericht gewijzigd door Evarist op ]

Door de 555 als astabiele multivibrator te schakelen, kan je diens frequentie enigzins beïnvloeden door de spanning op pin 5 te variëren. Maar dan kom je nog lang niet in de buurt van de eisen die je stelt.

Op 1 februari 2007 18:41:03 schreef evarist:
Ik dacht zelf aan een teller die Spannings-afhankelijk telt , van stilstaan tot snel , en bij een bepaalde waarde in de teller de puls stuurt en zichzelf terug reset.

Weet iemand of dit een goed idee is en hoe het te verwezenlijken?

Op 1 februari 2007 23:51:20 schreef evarist:
Ik ben niet zo erg thuis in Pics en AVRs. Ik zou nog eerst moeten leren programmeren. Tenzij iemand van jullie me daarmee wil helpen.Maar jullie hebben me een paar ideeen gegeven. Ik broed er even op door en laat zeker weten wat er uit de bus komt.
Hartelijk dank voor jullie reacties.

Pros, hoe kan ik die eerste 555 schakelen, dat begrijp ik nog even niet.

Ik wil je daar wel mee helpen (je hebt me goed geholpen met wat TV's :) ) Realisatie dmv een ATtiny13 is supersimpel en klein (1 DIL8 ICtje). Als je de precieze specificaties opgeeft kan ik wel wat programmeren..

Het idee op zich is niet slecht. Het grootste probleem is --denk ik toch-- dat je met een spanningvariatie van amper 0.4V de zaak moet sturen. Zelf zou ik eerst proberen, die 2.5V ... 2.9V om te zetten naar een spanning van 0V ... 4V. Eerst 2.5V aftrekken, dus (zener, stel dioden of een combinatie van beiden) en vervolgens 10 x versterken met een opamp. Dan heb je een bruikbaar bereik om een VCO te sturen, gevolg door een teller oid.
Tenandere, ook als je een avr of een pic moest inzetten, zal de nauwkeurigheid er zienderogen op vooruit gaan als je met een ingangsspanning van 0 tot 4V kan werken.

Op 2 februari 2007 13:02:23 schreef pros:
Het idee op zich is niet slecht. Het grootste probleem is --denk ik toch-- dat je met een spanningvariatie van amper 0.4V de zaak moet sturen. Zelf zou ik eerst proberen, die 2.5V ... 2.9V om te zetten naar een spanning van 0V ... 4V. Eerst 2.5V aftrekken, dus (zener, stel dioden of een combinatie van beiden) en vervolgens 10 x versterken met een opamp. Dan heb je een bruikbaar bereik om een VCO te sturen, gevolg door een teller oid.
Tenandere, ook als je een avr of een pic moest inzetten, zal de nauwkeurigheid er zienderogen op vooruit gaan als je met een ingangsspanning van 0 tot 4V kan werken.

Tis niet echt een lekker bereik, maar een ATtiny beschikt over een 10-bits A/D converter oftewel 1024 bits/5V = 4.88mV/bit. Als het nog preciezer moet, moet je idd die 2.5V eraf halen zodat je 0V-0.4V als ingangsbereik kunt nemen, dan pak je de interne 1.1V referentie voor je A/D conversie, kom je op 1.07mV/bit

Uit de datasheet:
0.5 LSB Integral Non-linearity
± 2 LSB Absolute Accuracy

Hoe lang moet de herhalingstijd net boven 2.5V zijn? Dus bij 2.51V zeg maar..

[Bericht gewijzigd door smsmonster op ]

Die 1.1V-referentiespanning v/d tiny13 had ik rats over het hoofd gezien. Het ingangssignaal met 2.5V verminderen is idd. (waarschijnlijk) voldoende.

Ik zou het ingangssignaal met iets minder dan 2.5V verminderen. Stel het uitgangssignaal van de sensor is 2.5V met wat ruis, dan kun je niet zeggen dat het resultaat van de A/D conversie kleiner dan 5 moet zijn om een oneindig lange herhalingstijd te krijgen zeg maar..

Eerste opzetje met 5V referentie:


#include <tiny13.h>
#include <delay.h>

//#define ADC_VREF_TYPE 0x40   //1.1V interne referentie
#define ADC_VREF_TYPE 0x00     //VCC referentie

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Declare your global variables here    

void main(void)
{
unsigned int waarde;
int wachttijd;

// Crystal Oscillator division factor: 1
CLKPR=0x80;
CLKPR=0x00;

// Input/Output Ports initialization
// Port B initialization
// Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In 
// State5=0 State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x20;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;

// ADC initialization
// ADC Clock frequency: 150.000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: None
// Digital input buffers off
DIDR0=0x0F;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x86;

while (1)
      {
      waarde=read_adc(1);   //analoge waarde inlezen
      wachttijd=0;          //formule moet hier komen
      
      if(waarde>512){       //spanning is hoger dan 2.5V
       PORTB.5=1;
       delay_ms(1);         //puls van 1ms
       PORTB.5=0;
       delay_ms(wachttijd); //gedurende een variabele tijd laag houden
      }
       

      };
}

Alleen de formule (het algoritme) moet dan nog bepaald worden, daar hebben we meer input van evarist voor nodig..

Hoe precies moeten de tijden zijn? De ATtiny13 kan op zijn interne RC-oscillator draaien (9.6MHz, de A/D converter draait in 10-bit mode maximaal op 15kSPS)

[Bericht gewijzigd door smsmonster op ]

Op 2 februari 2007 13:04:32 schreef smsmonster:
Hoe lang moet de herhalingstijd net boven 2.5V zijn? Dus bij 2.51V zeg maar..

Bij 2.5V herhalingstijd 0(oneindig, geen puls dus)
Bij 2.9V herhalingstijd 300ms
Bij 2.7V herhalingstijd 600ms
Bij 2.51V herhalingstijd 12000ms
Bij 2.52V herhalingstijd 6000 ms

Op 2 februari 2007 13:00:07 schreef smsmonster:
Ik wil je daar wel mee helpen (je hebt me goed geholpen met wat TV's :)

Dat is erg vriendelijk.Ik heb een programmer voor PIC's dus dat is geen probleem. De opbouw ook niet.Alleen de software, ik heb daarmee geen ervaring en geen tijd om het te leren.

[Bericht gewijzigd door Evarist op ]

Op 2 februari 2007 13:56:00 schreef evarist:
[...]
Bij 2.5V herhalingstijd 0(oneindig, geen puls dus)
Bij 2.9V herhalingstijd 300ms
Bij 2.7V herhalingstijd 600ms
Bij 2.51V herhalingstijd 12000ms
Bij 2.52V herhalingstijd 6000 ms

Dat ziet er niet linear uit, wat is de formule? Kwadratisch, Logarithmisch ?

Omgekeerd evenredig met het verschil met 2,5V.
t = 0.12/(U - 2.5) met t in seconden, U in volts

Dacht al aan een stroombron (met die 2,5 als referentie) en dan een puls bij het ontladen van de condensator als die een tweede referentie heeft bereikt.

Ik was ook in die richting aan het denken.

Op 2 februari 2007 14:35:37 schreef Frederick E. Terman:
Omgekeerd evenredig met het verschil met 2,5V.
t = 0.12/(U - 2.5) met t in seconden, U in volts

Dacht al aan een stroombron (met die 2,5 als referentie) en dan een puls bij het ontladen van de condensator als die een tweede referentie heeft bereikt.

Dan wordt dit hem:


#include <tiny13.h>
#include <delay.h>

#define ADC_VREF_TYPE 0x00     //VCC referentie

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

 

void main(void)
{
unsigned int waarde;
int wachttijd;  
float spanning;

// Crystal Oscillator division factor: 1
CLKPR=0x80;
CLKPR=0x00;

// Input/Output Ports initialization
// Port B initialization
// Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In 
// State5=0 State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x20;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;

// ADC initialization
// ADC Clock frequency: 150.000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: None
// Digital input buffers off
DIDR0=0x0F;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x86;

while (1)
      {
      waarde=read_adc(2);   //analoge waarde inlezen
      waarde=waarde-512;
      spanning=(waarde/1024.0)*5.0;
      
      wachttijd=120/spanning;
      
      if(waarde>512){       //spanning is hoger dan 2.5V
       PORTB.5=1;
       delay_ms(1);         //puls van 1ms
       PORTB.5=0;
       delay_ms(wachttijd); //gedurende een variabele tijd laag houden
      }
       

      };
}

Past net zo :P 89.3% van 1KB geheugen in gebruik, komt door die float..

VCC als referentie dus +/- 8mV precisie (2LSB) als je ervoor zorgt dat de VCC precies 5V is.. Ik kan wel even een hex-file compilen.. Heb je een programmer Stan?

http://www.smsmonster.nl/files/tiny13.jpg
ADC2 = ingang (5V max!)
PB5 = uitgang
HEX-file

En hoe reageert dat bij een spanning van precies 2.5V (floating overflow), en bij een spanning van 2.4V (negatieve wachttijd).

Je hebt gelijk, zo dan:


#include <tiny13.h>
#include <delay.h>

#define ADC_VREF_TYPE 0x00     //VCC referentie

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Declare your global variables here    

void main(void)
{
unsigned int waarde;
int wachttijd;  
float spanning;

// Crystal Oscillator division factor: 1
CLKPR=0x80;
CLKPR=0x00;

// Input/Output Ports initialization
// Port B initialization
// Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In 
// State5=0 State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x01;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;

// ADC initialization
// ADC Clock frequency: 150.000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: None
// Digital input buffers off
DIDR0=0x0F;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x86;

while (1)
      {
      waarde=read_adc(2);   //analoge waarde inlezen  
      if(waarde>512){       //spanning is hoger dan 2.5V
       waarde=waarde-512;
       spanning=(waarde/1024.0)*5.0;
       wachttijd=120/spanning;
      
       PORTB=PORTB|0x01;
       delay_ms(1);         //puls van 1ms
       PORTB=PORTB&0x00;
       delay_ms(wachttijd); //gedurende een variabele tijd laag houden
      }
       

      };
}

Zo is de kleinst mogelijke waarde van "waarde" 513, wat weer resulteert in een wachttijd van 24576ms.

Ook had ik iets fout gedaan met de poortjes, uitgang is PB0 ipv PB5..

Heb de schakeling hier opgebouwd, doet het prima (heb alleen geen scoop dus kan niet meten of de tijden ook daadwerkelijk kloppen maar zo op het oog lijkt het te werken (heb een LED aan PB0 hangen)..

1 ding echter: als de spanning even heel klein is geweest, zoals 2.51V ofzo, dan duurt het dus ook 12s voordat er een nieuwe sample genomen wordt.

@smsmonster.Bedankt voor je programma, dat was snel!
Maar ik wacht nog even af voor misschien een hardwareoplossing.Iemand?