Skocz do zawartości

Odczytywanie napięcia referencyjnego - STM, Tera Term


Pomocna odpowiedź

Napisano

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.

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

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

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

Połączenia czyli co?

[ Dodano: 26-06-2016, 13:21 ]

Mam załadowane biblioteki w Repository : C Library, CMSIS core, CMSIS_Boot, RCC, GPIO, ADC, USART

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.

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

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.

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...