Anonymní profil David – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil David – Programujte.comAnonymní profil David – Programujte.com

 

Příspěvky odeslané z IP adresy 89.103.179.–

zbynek
Mikrokontroléry › Testování bitu.
10. 3. 2014   #188079

#1 zbynek
Tak už jsem na to přišel. Stav toho pinu se musí vyčítat z registru PIND a ne PORTD. Achjo, taková blbost...   Až je člověku trapně.

zbynek
Mikrokontroléry › Testování bitu.
10. 3. 2014   #188074

Zdravím,

potřeboval bych radu od zkušenějších. Mám A/D převodník komunikující přes SPI a používám ATmegu8.
V kódu níže inicializuji SPI, poté zapíšu do konfiguračního registru A/D převodníku. Vždy když signál DRDY padne do logické nuly, znamená to, že jsou připravena nová data a mají se vyčíst příslušné registry obsahující výsledek převodu. Avšak provoz po SPI probíhá neustále (tzn. registry jsou zbytečně čteny pořád dokola i když obsahují "stará" data). Používám správně příkaz "while(PORTD & (1<<DRDY));"? Jde mi o to, aby mikrokontrolér počkal na log.0 na DRDY a až pak vyčetl obsah registrů. Napadlo mě, že by to mohlo být optimalizací, ale po vypnutí se nic nezměnilo. DRDY je na pinu PD2 a je nastaven jako vstup. Předem děkuji za rady.

void main(void)
{
  uint16_t ADC_Code = 0;
  spi_init_master();    
  spi_write(Configuration_write, 0xC1);
  while (1)
  {
    while(PORTD & (1<<DRDY));        
    ADC_Code |= spi_read(Reg_MSBs) <<8;
    ADC_Code |= spi_read(Reg_LSBs);
   }
}

szykorsky
Mikrokontroléry › Odporový dělič před ADC
18. 11. 2013   #184066

Nevím sice, kolik je ti let, ale myslím, že když k tomu dostaneš obrázek, tak by mohl i kluk jako ty, který, když na základní škole probíhala hodina češtiny, očividně toužebně myslel na svůj multimetr, poznat, co je myšleno dolním odporem. Možná nemá tolik zkušeností s elektronikou, ale na druhou stranu zvládne správně formulovat větu a vyjádřit myšlenku, což by měla být samozřejmost, ale pro některé jedince je to něco nepřekonatelného, jak nám (nejen v tomto příspěvku) předvádíš.

Jinak bych řekl, že fórum slouží primárně k tomu lidem pomoci a ne si z nich dělat srandu a dělat z nich blbečky, když jim něco nefunguje. Uvědom si, že ten člověk, co to psal, může být mnohem mladší. Zajímalo by mě, kolik zkušeností jsi měl třeba v devatenácti letech s A/D převodníkem a mikrokontrolérama ty. Ale zase je dobře, když sem přispíváš a trávíš tu nějaký čas. Alespoň má někdo jiný v tu chvíli od tebe klid.    

martine03
Mikrokontroléry › Odporový dělič před ADC
14. 11. 2013   #183926

Tak jsem všechno několikrát "propípal" multimetrem, zkontroloval propojení analogové a číslicové země (realizováno přes nulový odpor) a žádný zkrat jsem neobjevil. Myslíte, že by mohl být poškozený vývod? Tu megu jsem používal již několikrát v minulosti. 

martine03
Mikrokontroléry › Odporový dělič před ADC
13. 11. 2013   #183813

Jako vstupy mam ADC0 (PA0) a ADC1 (PA1), které používám. Na ostatních vývodech na bráně A mám pull-upy. 

martine03
Mikrokontroléry › Odporový dělič před ADC
12. 11. 2013   #183802

Na dělič přivádím 1,32 V a na R8 je celé přivedené napětí (1,32 V). Na ty zkraty mrknu. Uvažuju tedy správně, že by se za těchto podmínek mělo to napětí rozdělit mezi všechny tři rezistory dle jejich hodnoty?

martine03
Mikrokontroléry › Odporový dělič před ADC
12. 11. 2013   #183767

Ok, to chápu. Pokud ale nepřekročím napětí 5 V a nastavím hodnotu napětí např. na 1,32 V, tak na prvním ani druhém odporu nenaměřím žádné napětí. Veškeré napětí je na dolním rezistoru (na obrázku R8). To je způsobeno čím? Tady už žádné ochranné diody roli nehrají, ne?   

martine03
Mikrokontroléry › Odporový dělič před ADC
7. 11. 2013   #183504

Zdravím,

používám mikrokontrolér ATmega16 a snažím se měřit s A/D převodníkem
na dvou kanálech (ADC0 a ADC1) napětí 0 - 10 V. Jako referenční napětí mám AVCC. Prescaler je nastaven tak, aby převodník pracoval na frekvenci 62 500 Hz. Před vstupy mám odporový dělič:

10k, vstup ADC1, 22k, vstup ADC0, 27k, zem.

Bylo to spočítáno tak, že při 6 V bude na kanálu ADC1 4,983 V a dojde k přepnutí na kanál ADC0. Na něm bude při 10 V 4,937 V. 

Když však nastavím hodnotu napětí např. na 9,11 V, naměřím na prvním odporu (10k) 3,61 V, na druhém (22k) 170 mV a na třetím (27k) 5,33 V. Doufám, že mi někdo osvětlíte, proč je tomu tak. Myslel jsem si, že se napětí rozdělí klasicky úměrně hodnotě odporu.

Připojen obrázek.

David
Mikrokontroléry › Jak spočítat složitý vzorec?
24. 5. 2013   #176594

Zdravím,

řeším úlohu, ve které mám změřit A/D převodníkem stejnosměrné napětí a poté podle vzorce 10^(1,667xU-9.33), kde U je naměřené napětí, převést změřenou hodnotu na tlak. Neporadili byste mi někdo vhodný způsob, jak se s tímto vzorcem vypořádat? Našel jsem nějakou funkci pow z knihovny math.h, ale nevím, jestli je to optimální řešení. Používám 10bitový převodník. Rád bych se co nejvíc vyhnul všem float popř. doublům. Prosil bych případně co nejjasnější popis, jak to udělam, jsem totiž velký začátečník. :)

Předem děkuji za reakce.

Newbie
Mikrokontroléry › ADC Noise Reduction Mode
20. 5. 2013   #176342

No, to jsem právě chtěl využít. :D Proto jsem všechno nastavil ve fci ADC_Config() a na konci té funkce ho uspal. Představuji si to tak, že se během toho sleep módu provede konverze, po skončení se probudí a proběhne rutina přerušení. Program už jsem poupravil a na konci té rutiny volám fci ADC_Conversion(), ve které mám instrukci sei() a sleep_mode(), povolím tedy globálně přerušení a znovu ho uspím (aspoň doufám - tu knihovnu používám poprvé). Co tam mám napsat jsem zjistil metodou pokus-omyl. Jen nevím, jak správný je to postup..  

Newbie
Mikrokontroléry › ADC Noise Reduction Mode
20. 5. 2013   #176335

Dobrý den,

chtěl bych použít u mcu ATmega16 ADC Noise Reduction Mode. Odpovídající část programu vypadá takto:

#ifndef F_CPU
#define F_CPU 1000000UL
#endif

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include "lcd.h"

#define KvantizacniKrok 0.009775171

void ADC_Config(void)
{
//Konfigurace ADC
ADCSRA |= ((1<<ADPS1)|(1<<ADPS0)); //1 000 000:8 = 125 000
ADMUX &= ~(1<<ADLAR); //Volba zarovnání bitů
ADMUX |= 1<<REFS0; //Volba napěťové reference
ADMUX |= ((1<<MUX2)|(1<<MUX1)|(1<<MUX0)); //Volba kanálu ADC7
ADCSRA |= 1<<ADIE; //Povolení přerušení od ADC
ADCSRA |= 1<<ADEN; //Zapnutí ADC
sei(); //Globální povolení přerušení
MCUCR &= ((1<<SM2)|(1<<SM1));
MCUCR |= 1<<SM0; //Nastavení módu - ADC Noise Reduction Mode
MCUCR |= 1<<SE; //Povolit spánek
sleep_mode();
}

void main(void)
{
LCD_Init(); //Inicializace LCD
ADC_Config(); //Konfigurace ADC
while(1)
{    
}
}
 

ISR(ADC_vect) //ISR = Interrupt Service Routine, vektor přerušení pro A/D převodník - ADC_vect
{
uint8_t theLowADC = ADCL;
uint16_t theTenBitResults = ADCH<<8 | theLowADC; //Uložení 10bitů převodníku do jedné proměnné
double MeasuringSignal; 
MeasuringSignal = (double)theTenBitResults*KvantizacniKrok;
NamereneNapeti(MeasuringSignal);
Vysledek(theTenBitResults);
_delay_ms(300);
}

Myslím, že program takto provede pouze první konverzi. Jak ho tedy poupravit, aby pracoval kontinuálně? Napadlo mě napsat uživatelskou funkci a volat ji na konci rutiny přerušení (po _delay_ms(300);). Nevím však jaké bity v řídících reg. A/D převodníku v té funkci nastavovat. Datasheet jsem četl a moc moudrý jsem z něj nebyl. 

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032019 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý