Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
21_Alexandr_98
0 / 0 / 0
Регистрация: 12.11.2019
Сообщений: 13
1

STM32 АЦП

29.11.2019, 12:26. Просмотров 906. Ответов 7
Метки нет (Все метки)

Здравствуйте! Вопрос в следующем: хочу, получить массив данных с результатами преобразования АЦП(237,190,1130 и т.д.), но выходит только получить последнее значение преобразования, подскажите, пожалуйста, как сделать такое
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "stm32f10x.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_adc.h"
 
 
volatile int temperature;
volatile int adc_value;
volatile double voltage;
 
void usart_init(void)
{
    //Включение тактирования модуля USART1 и порта GPIOA
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
 
    // Инициализация GPIOs 
    GPIO_InitTypeDef GPIO_TxRx;
 
    // Конфигурируем USART1 Tx (Pin9) как альтернативную функцию push-pull 
    // Выбор 9 ножки
    GPIO_TxRx.GPIO_Pin = GPIO_Pin_9;
    //Режим работы
    GPIO_TxRx.GPIO_Mode = GPIO_Mode_AF_PP;
    //Скорость работы
    GPIO_TxRx.GPIO_Speed = GPIO_Speed_50MHz;
    //Связываем нашу структуру и конкретные регистры
    GPIO_Init(GPIOA, &GPIO_TxRx);
 
   // Конфигурируем USART1 Rx (Pin10) как входную функцию 
    // Выбор 10 ножки
    GPIO_TxRx.GPIO_Pin = GPIO_Pin_10;
    //Режим работы
    GPIO_TxRx.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    //Связываем нашу структуру и конкретные регистры
    GPIO_Init(GPIOA, &GPIO_TxRx);
 
 
    
    USART_InitTypeDef USART_init;
 
 
     */
    USART_init.USART_BaudRate = 115200;
    USART_init.USART_WordLength = USART_WordLength_8b;
    USART_init.USART_StopBits = USART_StopBits_1;
    USART_init.USART_Parity = USART_Parity_No;
    USART_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        //Инициализация настроек
    USART_Init(USART1, &USART_init);
 
 
    USART_Cmd(USART1, ENABLE);
 
}
    
void USARTSend(const unsigned char *pucBuffer)
{
    while (*pucBuffer)
    {
        
    
    USART_SendData(USART1, *pucBuffer++);
    
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
        {
                    
        }
                
    }
}
int main(void)
{
    
const unsigned char buffer[50] = {};
 
    const float V25 = 1e-2;
 
    usart_init();
 
    
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
 
// Инициализация АЦП
    ADC_InitTypeDef ADC_init;
    ADC_init.ADC_Mode = ADC_Mode_Independent;
    ADC_init.ADC_ScanConvMode = DISABLE;
    ADC_init.ADC_ContinuousConvMode = ENABLE;  
    ADC_init.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_init.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_init.ADC_NbrOfChannel = 1;
    ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5); 
    ADC_Init (ADC1, &ADC_init);    
 
    ADC_TempSensorVrefintCmd(ENABLE);
 
   
    ADC_Cmd (ADC1, ENABLE); 
 
 
 
    ADC_ResetCalibration(ADC1); 
    while(ADC_GetResetCalibrationStatus(ADC1));
 
    ADC_StartCalibration(ADC1); 
    while(ADC_GetCalibrationStatus(ADC1));
 
 
    ADC_Cmd (ADC1,ENABLE);  
    ADC_SoftwareStartConvCmd(ADC1, ENABLE); 
        
         while (1)
    {
    adc_value = ADC_GetConversionValue(ADC1);
 
    voltage=adc_value*0.000805664063;
    temperature = (uint16_t)(V25*adc_value) + 25;
    sprintf(buffer, "ADC=%d, Temperature=%d C, Voltage=%01.2f V,\r\n", adc_value, temperature, voltage);
 
    USARTSend(buffer); 
    }
}
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2019, 12:26
Ответы с готовыми решениями:

Stm32 Из ЦАП в АЦП
Задача очень проста, генерирую сигнал и подаю его с цапа на ацп. Ногу ЦАПа проверял на...

АЦП STM32 + мультиплексор
Приветствую! Товарищи, требуется консультация по АЦП. Собственно процессор STM32F103RET6. Требуется...

Опорное напряжение АЦП STM32
Джентльмены, прошу ткнуть носом где написано какое напряжение у встроенного ИОНа в STM32F100RBT6B....

Как в STM32 обозначается АЦП
Есть макетка с stm32f103ve пытаюсь запустить АЦП, но не могу найти ножку на контроллере которая...

Регулярные каналы АЦП STM32
Случилось так, что мне потребовалось получать данные от более чем 4-х каналов АЦП и соответственно...

7
_SayHello
788 / 474 / 156
Регистрация: 30.07.2015
Сообщений: 1,579
29.11.2019, 15:16 2
21_Alexandr_98, о каком массиве идет речь?
C
1
"ADC=%d, Temperature=%d C, Voltage=%01.2f V,\r\n"
Вот это отправляете, а что конкретно приходит?
0
21_Alexandr_98
0 / 0 / 0
Регистрация: 12.11.2019
Сообщений: 13
29.11.2019, 17:13  [ТС] 3
вот это приходит
0
21_Alexandr_98
0 / 0 / 0
Регистрация: 12.11.2019
Сообщений: 13
29.11.2019, 17:16  [ТС] 4
почему-то не загрузился скрин с первого раза
0
Миниатюры
STM32 АЦП  
29.11.2019, 17:16
_SayHello
788 / 474 / 156
Регистрация: 30.07.2015
Сообщений: 1,579
29.11.2019, 17:21 5
21_Alexandr_98, не очень понятно в чем проблема:
!) Вы оцифровали датчик температуры
2) Преобразовали код в напряжение и температуру.
3) Преобразовали результаты в строку
4) Отправили строку.
5) Повторили цикл
О каком массиве речь идет? Или нужно сформировать массив кодов АЦП?
0
21_Alexandr_98
0 / 0 / 0
Регистрация: 12.11.2019
Сообщений: 13
29.11.2019, 18:42  [ТС] 6
Да, вы правильно поняли, нужен массив кодов АЦП
0
_SayHello
788 / 474 / 156
Регистрация: 30.07.2015
Сообщений: 1,579
29.11.2019, 18:47 7
Лучший ответ Сообщение было отмечено 21_Alexandr_98 как решение

Решение

21_Alexandr_98, так и складывайте измеренияв массив:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define ADC_BUFFER_SIZE 50
uint16_t ADC_Buffer[ADC_BUFFER_SIZE];
uint16_t currentMeasure = 0;
 
....
 
while(1)
{
       ADC_Buffer[currentMeasure++] = ADC_GetConversionValue(ADC1);
       if(currentMeasure == ADC_BUFFER_SIZE)
       {
               //Send buffer to uart
               currentMeasure = 0;
       }
}
1
21_Alexandr_98
0 / 0 / 0
Регистрация: 12.11.2019
Сообщений: 13
29.11.2019, 19:09  [ТС] 8
Спасибо большое, именно то, что я хотел
0
29.11.2019, 19:09
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2019, 19:09

STM32 Проблемы с ADC (АЦП)
Здравствуйте, подскажите пожалуйста где ошибка. Была написана простая программа для...

Есть ли STM32 с АЦП, как у AVR?
Всем привет! Возникла задача по расширению уже имеющейся платы на AVR. Там с помощью режима АЦП,...

Discontinuous mode в dual режиме АЦП STM32
Здравствуйте! начинаю изучать программирование мк stm32 на базе китайской платки с контроллером...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.