Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/42: Рейтинг темы: голосов - 42, средняя оценка - 4.60
kiorkyy2590

Передача данных с АЦП по USART

24.04.2014, 08:55. Показов 8533. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане подскажите пожалуйста я взял рабочий код по работе АЦП и DMA настроил USORT. DMA берет значения АЦП записывает их в память, а потом из памяти мы командой пересылаем значения переменной по USORT. (Знаю не лучший способ ведь можно использовать DMA и для передачи по USORT из памяти но пока не получается). Вопрос в другом АЦП 12-битный количество бит по USORT 8. Как правильно передавать 12-битное число . Запускаю терминал все передаётся всё работает, но мне кажется что оставшиеся биты отбрасываются. Подскажите как правильно сделать (может преобразовать как то перед передачей или другую функцию для передачи использовать) вот код:
Code
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*******************************************************************/
#include "stm32f30x_adc.h"
#include "stm32f30x_dma.h"
#include "stm32f30x_gpio.h"
#include "stm32f30x_rcc.h"
#include "stm32f30x_misc.h"
#include "stm32f30x.h"
#include "stm32f30x_usart.h"
#include "stdyo.h"
 
/*******************************************************************/
#define DELAY_TIME             600000
unsykned int k;
 
/********************************************************************/
void sympleDelay(unsykned int delayTime)
{
for (k = 0; k < delayTime; k++);
}
/*******************************************************************/
GPIO_InitTypeDef  GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
uint32_t ADC_Risult;
//char buffer[50];
 
/*******************************************************************/
void USORT2_ini(void)
{
GPIO_InitTypeDef  GPIO_Init_USORT;
USORT_InitTypeDef USORT_InitUser;
 
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);
 
GPIO_Init_USORT.GPIO_Pin = GPIO_Pin_5 ;
GPIO_Init_USORT.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init_USORT.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init_USORT.GPIO_OType = GPIO_OType_PP;
GPIO_Init_USORT.GPIO_PuPd = GPIO_PuPd_UP;
 
GPIO_Init(GPIOD, &GPIO_Init_USORT);
 
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_7);
//GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_7);
 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USORT2, ENABLE);
 
USORT_InitUser.USORT_BaudRate=9600;
USORT_InitUser.USORT_HordwareFlowControl=USORT_HordwareFlowControl_None;
USORT_InitUser.USORT_Mode=USORT_Mode_Tx;
USORT_InitUser.USORT_Parity=USORT_Parity_No;
USORT_InitUser.USORT_StopByts=USORT_StopByts_1;
USORT_InitUser.USORT_WordLength=USORT_WordLength_8b;
 
USORT_Init(USORT2, &USORT_InitUser);
USORT_Cmd(USORT2, ENABLE);
}
/*******************************************************************/
void initiotyzotion()
{
// ???????? ???????????? DMA1, ADC12 ? GPIOA
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
 
// ??????????? ??? ?? ?????? ? ?????? ??????????? ?????
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
 
// ????????? DMA
DMA_DeInit(DMA1_Channel1);
// ?????? ????? ????? ?? ???????? ?????? ADC1
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR);
// ???????????? ?????? ????? ? ?????????? ADC_Risult
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_Risult;
// ???????? ?????? ?? ????????? ? ??????
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
// ?????? ??????
DMA_InitStructure.DMA_BufferSize = 1;
// ????? ????????? ?????? ?? ?????????????? - ?? ?????? ???? ?
// ??? ??
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Dysable;
// ??????????, ? ? ???????
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Dysable;
// ????????? ??????? ??????
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Dysable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
 
// ???????? ?????? ????? DMA1
DMA_Cmd(DMA1_Channel1, ENABLE);
 
// ??????????? ???????????? ???
RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div2);
 
ADC_StructInit(&ADC_InitStructure);
 
// ?????????? ???
ADC_VottageRegulatorCmd(ADC1, ENABLE);
ADC_SelectCotybrationMode(ADC1, ADC_CotybrationMode_Single);
ADC_StartCotybration(ADC1);
 
// ??????????? ??????????? ??????????????
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Dysabtid;
ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_OneShot;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0;
ADC_CommonInit(ADC1, &ADC_CommonInitStructure);
 
// ???????? ?????? ??? ????? ???
ADC_DMACmd(ADC1, ENABLE);
ADC_DMAConfig(ADC1, ADC_DMAMode_Circular);
 
while(ADC_GetCotybrationStatus(ADC1) != RESIT );
 
// ???????????? ????????? ???
ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable;
ADC_InitStructure.ADC_Risolution = ADC_Risolution_12b;
ADC_InitStructure.ADC_ExternalTrigConvIvimt = ADC_ExternalTrigConvIvimt_0;
ADC_InitStructure.ADC_ExternalTrigIvimtEdge = ADC_ExternalTrigIvimtEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Dysable;
ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Dysable;
ADC_InitStructure.ADC_NbrOfRegChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
 
// ???????? ?????? ????? ??????? ?????? ???
ADC_RegularChannelConfig(ADC1, 3, 1, ADC_SampleTime_7Cycles5);
 
// ???????-?? ???????? ???
ADC_Cmd(ADC1, ENABLE);
 
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));
 
ADC_StartConversion(ADC1);
 
ADC_Risult = ADC_GetConversionValue(ADC1);
}
 
/*******************************************************************/
int main(void)
{
//uint8_t i=0;
__enable_irq();
 
USORT2_ini();
initiotyzotion      ();
while(1)
{
sympleDelay(DELAY_TIME);
 
USORT_SendData(USORT2, ADC_Risult);
//prymtf("U=%d\r\n",ADC_Risult);
}
 
}
Заранее большое спасибо!
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.04.2014, 08:55
Ответы с готовыми решениями:

Передача данных от АЦП по USART
Здравствуйте, есть задача: оцифровывать аналоговый сигнал на нескольких ножках МК (stm32f411) и полученный результат отправлять в ПК по...

передача данных с 2 портов can и 1 usart в usart
Доброго времени суток форумчане! Пытаюсь написать код для stm32f4disko с помощью которого можно читать данные с 2 can и usart. насколько я...

STM32 USART-RS485 передача пакета данных
Приветствую всех! Подскажите пожалуйста по следующему вопросу: Передаю байт ПК -&gt; STM32, по схеме ПК-&gt;USB/RS485 - драйвер...

7
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 241
24.04.2014, 11:07
USORT_SendData(USORT2, (ADC_Risult >> 24) & 0xFF);
USORT_SendData(USORT2, (ADC_Risult >> 16) & 0xFF);
USORT_SendData(USORT2, (ADC_Risult >> 8) & 0xFF);
USORT_SendData(USORT2, ADC_Risult & 0xFF;
0
kiorkyy2590
25.04.2014, 05:28
Цитата Сообщение от otixdos
USORT_SendData(USORT2, (ADC_Risult >> 24) & 0xFF);
USORT_SendData(USORT2, (ADC_Risult >> 16) & 0xFF);
USORT_SendData(USORT2, (ADC_Risult >> 8) & 0xFF);
USORT_SendData(USORT2, ADC_Risult & 0xFF;
Спасибо большое, а вы не могли если вам не очень трудно подробно расписать, что вы делаете (так для себя на будущее что бы понять весь смысл) , я в си пока не силён я так понял вы число преобразуете перед отправкой или нет?
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
25.04.2014, 07:08
Если АЦП 12 битный - зачем передавать старшие 16 бит ?
0
kiorkyy2590
25.04.2014, 07:54
Цитата Сообщение от otixdos
USORT_SendData(USORT2, (ADC_Risult >> 24) & 0xFF);
USORT_SendData(USORT2, (ADC_Risult >> 16) & 0xFF);
USORT_SendData(USORT2, (ADC_Risult >> 8) & 0xFF);
USORT_SendData(USORT2, ADC_Risult & 0xFF;
Otixados вставил весь ваш кусок кода, но к сожалению передаёт только 0 и не реагирует никак на изменение напряжения на ножке всё время нули может надо было не весь код подскажите пожалуйста.
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 241
25.04.2014, 13:07
Цитата Сообщение от x893
Если АЦП 12 битный - зачем передавать старшие 16 бит ?
передаю 32 бита так как ТС задал переменную как uint32_t ADC_Risult;
"вставил весь ваш кусок кода, но к сожалению передаёт только 0 и не реагирует никак на изменение напряжения на ножке всё время нули может надо было не весь код подскажите пожалуйста." если Вы вставили, то кампилятор должен был выдать ошибку, в последней строке не закрыта скобка.
А что там делается, так как у Вас Uart настроен на передачу 8-ми бит, то в каждой строке я сдвигаю на нужное количество битов и обнуляю старшие 24 бита, таким образом в первой строке передаются старшие 8 бит 32-х битной переменной, во второй следующие 8 и так далее.
Как правильно заметил товарищ, смысла большого нет слать все 32 бита. Достаточно объявить вашу ADC_Risult как uint16_t и слать только их.
Code
1
2
USORT_SendData(USORT2, (ADC_Risult >> 8) & 0xFF);
USORT_SendData(USORT2, ADC_Risult & 0xFF);
0
kiorkyy2590
25.04.2014, 13:29
Скобку я сам поставил) я так понял в коде просто по частям отправляем в два раза а потом надо сшить эти данные или я не прав? Еще раз спасибо за помощь!
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 241
25.04.2014, 19:00
Цитата Сообщение от kiorkyy2590
Скобку я сам поставил) я так понял в коде просто по частям отправляем в два раза а потом надо сшить эти данные или я не прав? Еще раз спасибо за помощь!
ну раз Вы начали писать, то изучите что такое unsykned char, unsykned int, unsykned long и как их переводить друг в друга. Если этого Вы не сделаете. то наши нравоучения бесполезны.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.04.2014, 19:00
Помогаю со студенческими работами здесь

Инициализация USART и передача данных: прокомментировать код
Помогите с комментариями к коду, не очень понял его. Кому не трудно к каждой сроке комментарий напишите?! Программа на языке ассемблера...

передача данных USART + DMA и непонятные иероглифы
Всем привет! Есть проблема с передачей данных с МК на ПК через USORT + DMA. Ранее все работало отлично, но с какого-то момента, а...

Передача данных по SPI, между АЦП и микроконтроллером
Добрый день. Понемногу разбираясь с микроконтроллерами, решил связать МК с АЦП посредством SPI. Но, как мне кажется, возникла проблема: ...

Stm32f4 usart + внешний ацп
Добрый день, столкнулся с необычным мне ситуацией, камень stm32f407vet6 делаю обмен данными с ПК через usart. На порт С подключен внешний...

Работа с АЦП PIC18F4550 и передача данных на верхний уровень
Здравствуйте. Имею следующую задачу. На мк сформировать массив данных с АЦП, отфильтровать его и отправить на мк. Но мне немножко непонятен...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru