Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję

Kurs STM32 - #6 - Pomiar napięcia, przetwornik ADC

Autor Wiadomość
Komentator 




Posty: 865
Otrzymał 17 piw(a)
Wysłany: 08-10-2015, 09:38   Kurs STM32 - #6 - Pomiar napięcia, przetwornik ADC

KursSTM32_6
Tym razem poznamy bliżej działanie przetwornika analogowo-cyfrowego. Za jego pomocą będziemy mogli zmierzyć napięcie na wejściu układu. Podstawowa wiedza o ADC konieczna jest nie tylko przy budowie robotów. Peryferia te używane są w większości systemów, które mają czujniki.
UWAGA, to tylko wstęp!
Dalsza część artykułu dostępna jest na darmowym blogu Forbota.

Kliknij, aby przeczytać całość!


Poniżej znajdują się komentarze naszych użytkowników powiązane z tym artykułem.


Przeczytałeś artykuł? Dodaj komentarz!
Postaw piwo autorowi tego posta
 
 
Lukaszm 



Posty: 411
Pomógł: 16 razy
Otrzymał 14 piw(a)
Skąd: Warszawa
Programuję w:
C, C++
Należę do:
Sekcja Rakietowa SKA
Wysłany: 27-02-2016, 14:57   

Mam pytanie związane z zad. 6.1, chciałbym się upewnić czy dobrze rozumiem: wzór na wyliczenie częstotliwości próbkowania ADC to

gdzie N to ilość cykli zegara ADC na pomiar, tak?

Postaw piwo autorowi tego posta
 
 
bresio95 



Posty: 2
Wysłany: 24-11-2016, 10:54   

Witam mam pytanie odnoście uzyskiwania wyników pomiaru napięcia referencyjnego.
Pobrałem program Tera Term 4.92 i po wybraniu odpowiedniego portu: COM3: STMicroelectronics STLink Virtual COM Port (COM3) otrzymuję takie wyniki:



W kursie forbota wszystko się ładnie wyświetla, a u mnie jak widać. Szukałem odpowiedzi w Internecie lecz bez skutku.

Postaw piwo autorowi tego posta
 
 
liebenthal 



Posty: 1
Wysłany: 26-11-2016, 23:30   

bresio95, maliem to samo. upewnij sie, ze w zakladce setup/serial port masz ustawione baud rate na 11520.

Postaw piwo autorowi tego posta
 
 
Lukaszm 



Posty: 411
Pomógł: 16 razy
Otrzymał 14 piw(a)
Skąd: Warszawa
Programuję w:
C, C++
Należę do:
Sekcja Rakietowa SKA
Wysłany: 27-11-2016, 08:40   

Cytat:
11520

Na pewno?

Postaw piwo autorowi tego posta
 
 
bresio95 



Posty: 2
Wysłany: 29-11-2016, 14:26   

Dzięki liebenthal i Lukaszm, działa na 115200, zabrakło jednego zera ;)

Ostatnio zmieniony przez bresio95 29-11-2016, 14:27, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 
 
argens 



Posty: 4
Skąd: Herford
Wysłany: 13-12-2016, 08:42   Zad 6.2

Włącza diodę, jeśli pada za mało światła na fotorezystor.

Kod programu: Zaznacz cały
#include "stm32f10x.h"
#include <stdio.h>

void send_char(char c)
{
 while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
 USART_SendData(USART2, c);
}

int __io_putchar(int c)
{
 if (c=='\n')
 send_char('\r');
 send_char(c);
 return c;
}

int main(void)
{
 GPIO_InitTypeDef gpio;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

 GPIO_StructInit(&gpio);

 gpio.GPIO_Pin = GPIO_Pin_0;
 gpio.GPIO_Mode = GPIO_Mode_AIN;
 GPIO_Init(GPIOA, &gpio);

 gpio.GPIO_Pin = GPIO_Pin_2;
 gpio.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_Init(GPIOA, &gpio);

 gpio.GPIO_Pin = GPIO_Pin_3;
 gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOA, &gpio);

 gpio.GPIO_Pin = GPIO_Pin_13;
 gpio.GPIO_Mode = GPIO_Mode_IPU;
 GPIO_Init(GPIOC, &gpio);

 GPIO_StructInit(&gpio);
 gpio.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|
                         GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
 gpio.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_Init(GPIOC, &gpio);

 USART_InitTypeDef uart;

 USART_StructInit(&uart);
 uart.USART_BaudRate = 115200;
 USART_Init(USART2, &uart);
 USART_Cmd(USART2, ENABLE);

 ADC_InitTypeDef adc;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
 RCC_ADCCLKConfig(RCC_PCLK2_Div6);                    //dzielnik napiecia, zeby zegar (64 MHz) zmniejszyc ponizej 14 MHz)

 ADC_StructInit(&adc);
 adc.ADC_ContinuousConvMode = ENABLE;
 adc.ADC_NbrOfChannel = 1;
 adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
 ADC_Init(ADC1, &adc);

 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_71Cycles5);    //Ustawienie kanalu wejsciowego (kanal 0 multipleksera)
 ADC_Cmd(ADC1, ENABLE);

 ADC_ResetCalibration(ADC1);                        //autokalibracja przetwornika
 while (ADC_GetResetCalibrationStatus(ADC1));

 ADC_StartCalibration(ADC1);
 while (ADC_GetCalibrationStatus(ADC1));

 ADC_TempSensorVrefintCmd(ENABLE);                    //wlaczenie napiecia referencyjnego
 ADC_SoftwareStartConvCmd(ADC1, ENABLE);

 while (1)
 {
     uint16_t adc = ADC_GetConversionValue(ADC1);        //wyslanie wyniku po UART
     printf("Adc = %d (%.3fV)\r\n", adc, adc * 3.3f / 4096.0f);

     if (adc <= 3000)                                //wlacza diode, jesli za malo swiatla pada
     {
         GPIO_SetBits(GPIOC, GPIO_Pin_0);
     }

     else
     {
         GPIO_ResetBits(GPIOC, GPIO_Pin_0);
     }

 }
}

Ostatnio zmieniony przez argens 13-12-2016, 08:47, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 
 
Qwazi 



Posty: 12
Wysłany: 18-05-2017, 08:43   

Mam dość głupie, ale ważne dla mnie pytanie.
Skąd wartość napięcia referencyjnego 1.2V? Mógłby mi ktoś to wytłumaczyć? Szukam w dokumentacji ale nigdzie tej informacji znaleźć nie mogę (zapewne szukam źle).

Postaw piwo autorowi tego posta
 
 
Elvis 



Posty: 1300
Pomógł: 92 razy
Otrzymał 244 piw(a)
Skąd: wawa
Programuję w:
C, asm
Wysłany: 18-05-2017, 09:07   


Postaw piwo autorowi tego posta
 
 
Szwagier90 



Posty: 7
Otrzymał 2 piw(a)
Programuję w:
C, C++, Python
Wysłany: 17-06-2017, 19:10   

Mam mały problem / wątpliwość. Po włączeniu konwersji VRef, wartość jaka jest odczytywana na moim DiscoveryF0 to 1690+-, gdy tymczasem tutaj jest opisane, że powinno być 1490+-. Wg noty katalogowej procesora znajdującego się na mojej płytce, napięcie VRef powinno być takie samo jak w tym kursie. Co może być nie tak?

Postaw piwo autorowi tego posta
 
 
 
smilee 



Posty: 1
Skąd: Coventry
Wysłany: 12-11-2017, 03:19   

Zadanie domowe 6.5. Podłączyłem dwa fotorezystory, wszystko działa ok, tylko zdarzenie kiedy oba kanały mają dokładnie taką samą wartość napięcia następują niezwykle rzadko (co jest zrozumiałe, przy takich pomiarach).
Czy ktoś może podać sugestię, jak zrealizować porównanie "mniej-więcej"? Tzn, chciałbym zrobić warunek:
Kod programu: Zaznacz cały
if (ADC_kanal1 == ADC_kanal2) printf "prosto";

, z tym, że ADC_kanal1 może różnić się od ADC_kanal2 o jakąś założoną przeze mnie wartość, powiedzmy x.

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 12-11-2017, 14:10   

smilee, witam na forum :)
Najlepiej odejmować jeden pomiar od drugiego i sprawdzać jaka jest wartość bezwzględna wyniku. Możesz uznać, że jeśli różnica jest mniejsza o 20, to znaczy, że wskazania można traktować jako równe :)


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Kurs STM32 - #3 - Pł... Kurs STM32 - #5 - Ko... Kurs STM32 - #1 - Za... Kurs STM32 - #2 - Po...
lub przeszukaj forum po wybranych tagach: artykul, automatyka, elektronika, poradnik, robotyka


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki