Skocz do zawartości

Odczytywanie napięcia referencyjnego - STM, Tera Term


Ksiina

Pomocna odpowiedź

Witam, niedawno zacząłem zabawę z programowaniem STM'ów. Próbuję zmierzyć napięcie referencyjne według tego kursu :

https://forbot.pl/blog/artykuly/programowanie/kurs-stm32-6-pomiar-napiecia-przetwornik-adc-id8462

Czy w Tera Term napięcie powinno zostać mierzone automatycznie po uruchomieniu programu?

W kodzie nie mam żadnych błędów, ale nie wyświetla mi napięcia w Tera Term. Jest w stanie ktoś coś podpowiedzieć?

Z góry dziękuję za pomoc.

Pozdrawiam.

Link do komentarza
Share on other sites

Ksiina, tak, powinno ruszyć z automatu. Czy inne programy korzystające z UART w tym kursie działały u Ciebie poprawnie?

Udało mi się komunikować z UART (odczytywanie z terminalu Hello World).

Mój kod napięcia referencyjnego.

#include <stdio.h>
#include "stm32f10x.h"

#include <stdio.h>
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.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;
USART_InitTypeDef uart;
ADC_InitTypeDef adc;

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);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);

GPIO_StructInit(&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);

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

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_17, 1, ADC_SampleTime_71Cycles5);
ADC_Cmd(ADC1, ENABLE);

ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1));

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

ADC_TempSensorVrefintCmd(ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

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

Ustawienia tera term:

https://www.forbot.pl/forum/upload_img/obrazki/IMG_576fb7ec0fc9c5257.jpg

Link do komentarza
Share on other sites

Ksiina, nie mam w tej chwili tego sprzętu pod ręką, więc nie sprawdzę kodu w praktyce. Zerknij jednak dla pewności, czy inne kody z kursu działają. Kurs ten dostępny jest już całkiem długo i do tej pory nikt nie zgłaszał żadnych problemów, więc raczej problem zapewne jest gdzieś po Twojej stronie (może np. w połączeniach)?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Ksiina, zapomniałem, że w przypadku płytek Nucleo konwerter jest już wbudowany w płytkę. Dodaj może dla pewności w programie wyświetlanie jakiegoś tekstu typu Hello World przy starcie - będziesz wtedy widział, czy program startuje oraz, czy poprawnie rusza komunikacja.

Link do komentarza
Share on other sites

Jak to zapisać żeby na starcie wyświetlał się tekst?

Wystarczy dopisać nad

  uint16_t adc = ADC_GetConversionValue(ADC1);    
send_string("Hello world!\r\n"); 

Coś takiego?

while (1) {
	send_string("Hello world!\r\n");
	uint16_t adc = ADC_GetConversionValue(ADC1);
	printf("Adc = %d (%.3fV)\n", adc, adc * 3.3f / 4096.0f);
}

Coś takiego napisałem ale nadal nie działa.

#include <stdio.h>
#include "stm32f10x.h"

#include <stdio.h>
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"


void send_string(const char* s)
{
	while (*s)
		send_char(*s++);
}

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;
USART_InitTypeDef uart;
ADC_InitTypeDef adc;

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);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);

GPIO_StructInit(&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);

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

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_17, 1, ADC_SampleTime_71Cycles5);
ADC_Cmd(ADC1, ENABLE);

ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1));

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

ADC_TempSensorVrefintCmd(ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

while (1) {
	send_string("Hello world!\r\n");
	uint16_t adc = ADC_GetConversionValue(ADC1);
	printf("Adc = %d (%.3fV)\n", adc, adc * 3.3f / 4096.0f);
}
}
Link do komentarza
Share on other sites

Jeśli masz z tym problemem, to najlepiej idź od drugiej strony. To znaczy, weź działający program, który wyświetla samo Hello World i dodawaj do niego kolejne fragmenty kodu od ADC - krok, po kroku, zgodnie z kursem. Wtedy zobaczysz dokładnie, który fragment nowego kodu jest problematyczny.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.