Kan ik de waarde die ik lees analog read pin vasthouuden als uitput.
Dus stel op anolog read pin A0 komt 500 milivolt binnen en gaat via de PWM pin eruit, kan ik dan op de een of andere manier die 500 milivolt vast houden als uitgaand. Ondanks dat op de ingang A0 al een ander voltage aanwezig is? duseigelijk het vasthouden van een voltage, soort van sample hold?
Hoe bepaal je het moment dat die waarde vast gehouden moet worden?( drukknopje ofzo?) Gebruik die waarde dan om wel of niet de waarde op A0 te meten..
if (voorwaarde) sample=gemeten_waarde;
Als je de maximum spanning (of misschien wel de minimum spanning) wil vasthouden, dan hoef je alleen maar af te vragen of de waarde op A0 groter is, zo ja dan is de samplewaarde de waarde van A0..
Het is me al gelukt. ik trigger vasthouden met een puls op een digitale pin.
Maar nu het werkt duikt er een probleem op.
Het is alles behalve precies. Dus er gaat bijv op A0 500 mvolt in vervolgens hold ik de waarde van de uitgaande pwm pin, en deze zou dan exact gelijk moeten zijn als de input.
Maar wijkt behoorlijk af. en zit er soms meer dan 30 mvolt langs.
Inmiddels weet ik hoe dat komt en heeft meet de resolutie te maken.
Dit kan je verbeteren door interne referentie te gebruiken.
Standaard gebruikt de uno als referentie de voedingsspanning. stelll deze is exact 5 volt. Dan
is de resolutie 5 / 1023 = 0.00488 milivolt. Zeg maar 5 milivolt. Gebruik je de externe AREF pin of de interne ref van 1,1 volt dan heb je een resolutie van 1.1 /1023 = 1 milivolt . Dus vele malen precieser. maar hoe precies ???
Met het laatste stukje uit je bovenstaande bericht, sla je de spijker op de kop:
maar hoe precies
Nou, heel precies.
Zorg er voor dat je heel duidelijk communiceert.
Dus stel geen dubbelzinnige vragen: vragen die op meerdere manieren gelezen en / of uitgelegd kunnen worden.
Wanneer die vragen of opmerkingen toch dubbelzinnig blijken, kan het zijn dat je een heel ander antwoord krijgt omdat iemand je niet goed begrepen heeft.
Of dat iemand dan maar gaat aannemen wat je dan eigenlijk bedoelt te vragen.
Ik ga nu maar aannemen dat je niet weet hoe je de analoge referentie van je controller anders instelt.
Dit soort zaken kun je terug vinden in de Arduino Reference Guide (klik !) (in de Engelse taal).
Als gebbetje is dat ook een beetje dubbelzinnig, want de Reference Guide gaat niet over de Analog Reference, maar zo'n beetje alles wat je met de IDE kunt doen is daarin beschreven.
En das dus inclusief het instellen van de analoge referentie.
Als je op bovenstaande link klikt, kom je meteen op de pagina terecht die dat instellen van de analoge referentie beschrijft (dus in het Engels).
Nou nou een heel verhaal MAS3! Dat snap ik ook wel hoe ik hem met 1 regel op intern kan zetten.
Maar daarmee ben je er nog lang niet.
En staat niet beschreven.
Dan is dus het 1e deel van mijn vorige bericht van toepassing:
Wat is je exacte probleem ?
Zou het er eventueel mee te maken kunnen hebben dat je gaat meten met 10 bits, en vervolgens gaat uitsturen met 8 bits ?
Of dat je een sample neemt, en vervolgens een digitale waarde uitstuurt ?
PWM lijkt analoog, maar is het niet.
Je stuurt dus geen millivolts uit, maar een percentage.
Dat kun je wel converteren, maar daarbij zul je verliezen krijgen die je dan weer moet compenseren als je t nauwkeurig wil hebben.
Zie je , ik zit maar een beetje te gokken naar wat er aan de hand zou kunnen zijn.
simpel toch. voltage erin voltage eruit. Dit is niet erg nauwkeurig. wil je dit zo nauwkeurig mogelijk doen. Dan zal je jezelf moeten verdiepen in het Aref verhaal!
ingangs signaal is 1023
uitgang is slechts 255 en dan heb je een lagere resolutie en dus 5Volt/255 is iets beter als 1 % ja weet ook wel dat het theoretisch precieser is, echter praktisch is 1% erg goed.
als het precieser moet is een opamp met sample/hold beter. of op een andere manier zoals met een analoge ingang een potmeter met een stappenmotor sturen waardoor je een analoog uitgangssignaal krijgt.
Die 1% wat je zegt weet ik niet zo net, volgens mij is het standaard zo.
5 volt (als je voeding super stabiel is ander geeft het zo ie zo constant afwijjking) 5.0 /1023 = 4.88 mv per stapje (Input) 1023/255 = 4. Dus 4 x 4.88 = 19,52 mvolt. Hij werkt dan dus met 255 delen van 19.5 milivolt. Het is dan maar net waar hij naar toeschiet naar boven of naar onder. Dus 19.5 meerof minder Dit is alles behalve nauwkeurig, zeker niet voor bijv.gevoelig sensoren.
Nou het is toch gelukt, Het bereik watik nodig heb ligt tussen de 0 en 650 miliivolt, Eerst heb ik de reference (input) op intern gezet . Dit betekend 1.086 volt / 1023 = 1.06 milivolt. (reference intern is niet precies 1.1 volt dit is bij elk board anders. bij mij 1.086) Dit kan je nameten door hem op intern ref te zetten en vervolgens te meten op de Aref pin. Deze waarde is je interne ref.
Dus de resolutie is hiermee sterk verbeterd. 1.06 mvolt per stapje! Vervolgens heb ik PWM pin 10 van acht bit naar 16 bit gezet.
16 bit kan alleen op pwmpin 9 en 10. (ingewikkeld verhaal) Vervolgens heb ik met map de boel geijkt zeg maar.
Resultaat in en uitgang tot op de milivolt nauwkeurig!
En dan met Hold functie (PWM uitput) wat de bedoeling was.
Wat ook een addertje onder gras is. is dat de eerste paar metingen niet accuraat zijn na het opstarten. Dit heb ik opgelost door in de setup drie nieuwe metingen achter elkaar te doen.
Vervolgens is het goed, hij moet eerst even settelen.
Het betreft hier een UNO,
Dacht dat het niet meer zou lukken maar het is toch mogelijk zonder een DAC.
1, ja als je de aref op 1 volt zet dan is de ingang al een stuk beter. precies zoals je beschrijft.
2. leg mij maar eens uit hoe je de uitgang zoveel beter hebt gemaakt dan, want een PWM signaal is van 0 tot 5 volt schakelend.
en ja je kunt dat natuurlijk schalen tot 1 volt en dan heb je dus ongeveer 0.5% is dus 5 mVolt per stap.
en ja je kunt dat weer opdelen door er een tweede PWM bij te hangen die dan bijvoorbeeld elke stap in 8 deelt, dus dan zit je theoretisch onder de 1 mV,
praktisch heb je best veel last van onnauwkeurigheden in timing ed.
wellicht kun je beter een D/A conerter gebruiken die zijn in een klap gelijk 16 Bits, dat kun je trouwens ook op de ingang zetten er is een goedkope 24 Bits converter voor weegcellen oa.
shooter:
1, ja als je de aref op 1 volt zet dan is de ingang al een stuk beter. precies zoals je beschrijft.
2. leg mij maar eens uit hoe je de uitgang zoveel beter hebt gemaakt dan, want een PWM signaal is van 0 tot 5 volt schakelend.
1 JE KAN AREF EXTERN GEBRUIKEN OF INTERN (UNO) +- 1.1 VOLT analogReference(INTERNAL);
2 GOED OPGEMERKT! DAAROM DACHT IK DAT GAAT NIET GOEDKOMEN. DAT DUURDE EEN EIND VOOR IK DAT DOOR HAD. BEST SUF GEMAAKT ALLEMAAL.
en ja je kunt dat natuurlijk schalen tot 1 volt en dan heb je dus ongeveer 0.5% is dus 5 mVolt per stap.
en ja je kunt dat weer opdelen door er een tweede PWM bij te hangen die dan bijvoorbeeld elke stap in 8 deelt, dus dan zit je theoretisch onder de 1 mV,
praktisch heb je best veel last van onnauwkeurigheden in timing ed.
wellicht kun je beter een D/A conerter gebruiken die zijn in een klap gelijk 16 Bits, dat kun je trouwens ook op de ingang zetten er is een goedkope 24 Bits converter voor weegcellen oa.
SCHALEN IDD. IVM MET DE KLOK INDELING KAN PIN 9 OF 10 OF BEIDE OP 16 BIT ZETTEN, OF OP 15 BIT OF 14....
IK DENK DAT HET NU ZO ZIT ID 5 VOLT / DELEN DOOR DE 16 BIT WAARDE (65535) EN DAN SCHALEN WAT JIJ ZEGT MET MAP.
IK ZIE HET ALS EEN TRAP DE INGANG NU TREDE VAN I.061 MILIVOLT. DE UITGANG EEN TRAP NA HET SCHALEN MET MAP MAX 14250. 5 VOLT / 65535 = 0.07 MILIVOLT TRAPJES?? DAT IS VERVOLGENS DAN 14250 X 0.07 = 1.087 VOLT! DUS DAN KLOPT HET MET MIJN MAP WAARDES.
OPMERKING; 16 BIT PWM WORDT DAN 30.5175Hz
En ik denk dat nu in mijn geval als het net allemaal verkeerd "valt" dat er nog steeds een maximale afwijking in kan zitten van 1. ingang 1,061 stapjes milivolt die dan net naar boven of naar onder kan afronden + 2. uitgang van 0.076 die naar boven of onder kan afronden. 1.061 + 0.076 = 1.137 miliivolt. En dit zie ik dan soms ook in een meting. Het kan alleen nog beter als de ingang A0 ook naar 16 bit gezet zou kunnen worden. Maar dat zal wel niet.
Er word maar 1 A/D Converter gebruikt in deze chip.
De chip kan 8 pinnen schakelen naar die ene ADC, maar met een PDIP met 28 pinnen, zijn er niet genoeg pinnen om dat te doen, en moet je het maar met 6 pinnen zien te redden.
Zit de chip in een andere behuizing (TQFP), dan heeft ie 32 pinnen en heb je ook nog de beschikking over A6 en A7 (die alleen als analoge ingang gebuikt kunnen worden).
Die ene ADC heeft dus een 10 bits diepte en kan daarmee 1024 stappen onderscheiden.
Met 16 bits zou je op 65536 stappen uitkomen, maar dat lukt je dus alleen met extra hardware.
Er zijn overigens ook 12 en 14 bits ADCs.
MAS3:
Er word maar 1 A/D Converter gebruikt in deze chip.
De chip kan 8 pinnen schakelen naar die ene ADC, maar met een PDIP met 28 pinnen, zijn er niet genoeg pinnen om dat te doen, en moet je het maar met 6 pinnen zien te redden.
Zit de chip in een andere behuizing (TQFP), dan heeft ie 32 pinnen en heb je ook nog de beschikking over A6 en A7 (die alleen als analoge ingang gebuikt kunnen worden).
Die ene ADC heeft dus een 10 bits diepte en kan daarmee 1024 stappen onderscheiden.
Met 16 bits zou je op 65536 stappen uitkomen, maar dat lukt je dus alleen met extra hardware.
Er zijn overigens ook 12 en 14 bits ADCs.
Ik heb het niet verzonnen ben geen programmeur en heb die uno pas net. Maar ik kan goed zoeken en lezen.
Het werkt als een trein. En het is maar een klein stukje code. gemaakt door iemand die blijkbaar weet wat ie doet. en daar hoor jij niet bij!
Als jij in de A0 0 tot 1000 milllivolt in kan sturen en exact dat uit pin 10 of 9 eruit laat komen met een tolerantie van zeg 1 milivolt, dan mag je meepraten amateur.
Kun je de sketch laten zien ? dan heeft misschien iemand anders er iets aan.
We waren lang in de war, omdat we dachten dat er 0...5V binnen kwam er 0...5V uit moest gaan.
Timer1 kan 16-bit PWM doen. Als je niet meer de Arduino functie analogWrite() gebruikt, maar de Timer1 gaat programmeren, dan kun je meteen de frequentie flink omhoog doen. Welke frequentie gebruik je ?
De interne referentie hangt af van de VCC en de temperatuur. Als je VCC van een spanningsregelaar komt, dan is het vooral de temperatuur. Dus als je de Arduino binnen en buiten gebruikt, dan kun je een verschil merken.
De uitgaande 5V van het PWM signaal hangt af van de VCC. Als je voedingsregelaar 5% nauwkeurig is, dan is je PWM dus ook 5% onnauwkeurig.
Kun je een schema laten zien van je filter ? Bij lage weerstanden wordt de uitgangspanning van een pin al snel lager.
Wanneer de interne multiplexer wordt omgezet, dan kan de eerste analoge waarde afwijken. In theorie zou de tweede correct moeten zijn, maar in mijn code doe ik soms ook een paar "dummy" analogRead(), om nauwkeuriger te zijn.
Het enige wat nog overblijft is de manier waarop je de PWM waarde verandert. Afhankelijk van de PWM mode kan dat een glitch geven, of de Timer1 kan doortellen tot 0xFFFFFFFF voordat de nieuwe waarde wordt overgenomen. Dit is voor mij (te) ingewikkeld, dus ik kan niet aan je code zien of het goed is.
mas3 kun je rensberl eruit kiepen, want hij noemt je een amateur en dat vind ik niet netjes,
terwijl ik vraag hoe hij een pwm 16 bit maakt, ook nog met twee pinnen (9 en 10), want ik wil graag weten hoe hij dat doet.
Hij heeft bovendien gelijk: ik ben ook een amateur, en daar is Arduino ook voor bedoeld.
Een paar minuten zoeken gaat al laten zien dat je van deze gebruiker nooit een sketch gaat zien.
Want schijnbaar is alles waar´ie op internet hulp mee zoekt, uitermate geheim.
Vragen zat, maar nooit meer informatie over waar het voor is dus onmogelijk om een gericht antwoord te geven.
Maar hij heeft t perfect opgelost want het werkt prima.
Veel plezier er mee hoor.
Koepel:
Kun je de sketch laten zien ? dan heeft misschien iemand anders er iets aan.
We waren lang in de war, omdat we dachten dat er 0...5V binnen kwam er 0...5V uit moest gaan.
Timer1 kan 16-bit PWM doen. Als je niet meer de Arduino functie analogWrite() gebruikt, maar de Timer1 gaat programmeren, dan kun je meteen de frequentie flink omhoog doen. Welke frequentie gebruik je ?
De interne referentie hangt af van de VCC en de temperatuur. Als je VCC van een spanningsregelaar komt, dan is het vooral de temperatuur. Dus als je de Arduino binnen en buiten gebruikt, dan kun je een verschil merken.
De uitgaande 5V van het PWM signaal hangt af van de VCC. Als je voedingsregelaar 5% nauwkeurig is, dan is je PWM dus ook 5% onnauwkeurig.
Kun je een schema laten zien van je filter ? Bij lage weerstanden wordt de uitgangspanning van een pin al snel lager.
Wanneer de interne multiplexer wordt omgezet, dan kan de eerste analoge waarde afwijken. In theorie zou de tweede correct moeten zijn, maar in mijn code doe ik soms ook een paar "dummy" analogRead(), om nauwkeuriger te zijn.
Het enige wat nog overblijft is de manier waarop je de PWM waarde verandert. Afhankelijk van de PWM mode kan dat een glitch geven, of de Timer1 kan doortellen tot 0xFFFFFFFF voordat de nieuwe waarde wordt overgenomen. Dit is voor mij (te) ingewikkeld, dus ik kan niet aan je code zien of het goed is.
DDRB |= _BV(PB2) | _BV(PB3); /* set pins as outputs /
TCPCR1A = _BV(COM1A1) | _BV(COMM1B1) / non-inverting PWM /
| _BV(WGM11); / mode 14: fast PWM, TOP=ICR1 /
TCPCR1B = _BV(WGM103) | _BV(WGM12)
| _BVC(CS100); / no prescaling /
ICR1 = 0xfffffff; / TOP counter value */
//}
/* 16-bit version of analogWrite(). Works only on pins 9 and 10. */
//void analogWrite16(uint8_t pin, uint16_t val)
{
switch (pin) {
case 9: OCR1A = val; break;
case 10: OCR1B = val; break;
change the analog out value:
print the results to the Serial Monitor:
}
Je kan het systeem ook zelf calibrerend maken:
Je meet op ingang 1, zet dat door naar uitgang1 in PWM. Zet dat om naar een analoge spanning en voert dat toe aan ingang 2. Het verschil tel je bij ingang 1 op bij de omzetting naar uitgang 1.
Als dat verschil dus bijv 30mV is, dan zal de PWM uitgang naar een waarde gestuurd worden van I1+30mV wat dan weer resulteert in een spanning die gelijk is aan I1,
Mits I1 en I2 bij dezelfde spanning een zelfde uitgang kunnen genereren.
Deze functie moet je dan laten lopen tot je Hold effectief maakt.