#c #stm32 #adc #nucleo #stm32cubeide
#c #stm32 #АЦП #nucleo #stm32cubeide
Вопрос:
Я использую NucleoF413ZH и STM32CubeIDE. У меня есть 16 микрофонов, каждый из которых подключается к одному каналу АЦП и благодаря использованию DMA направляет данные в память. Однако я хотел бы выполнить взаимную корреляцию сигналов, поэтому я пришел к выводу, что я отправлю данные на ПК или RPi 4b, и я бы выполнил вычисления там. Но проблема для меня заключается в отправке такого большого количества данных из памяти. Я пытаюсь использовать CDC_TRANSMIT_FS, но я не могу отправить все 16 измерений канала, также передача очень медленная. Есть ли какой-либо способ отправить весь массив из 16 элементов или даже лучше 16xM элементов, так что, возможно, это будет быстрее? Мне нужно 16mic x10bit x44,1 кГц ~ = 7 Мбит / с = 882 Кбайт / с, также я могу уменьшить некоторые микрофоны до 12 из них. Вот мой код (полный по ссылке https://pastebin.pl/view/6059edc8 ):
Кроме того, извините, если что-то не подходит грамматически, английский — мой второй язык, и я все еще учусь
/* USER CODE BEGIN PV */
uint16_t Pomiar[16]; // measurments 16x1
char msg[10];
uint8_t DataToSend[40]; //
uint8_t MessageCounter = 0; //
uint8_t MessageLength = 0; // Msg lngth
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(amp;hadc1, (uint16_t*)Pomiar, 16);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// CDC_Transmit_FS((uint8_t*)Pomiar, (512));
// MessageCounter;
//MessageLength = sprintf(DataToSend, "Wiadomosc nr %dnr", MessageCounter);
// MessageLength = sprintf(DataToSend, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%dnr", Pomiar[0],Pomiar[1],Pomiar[2],Pomiar[3],Pomiar[4],Pomiar[5],Pomiar[6],Pomiar[7],Pomiar[8],Pomiar[9],Pomiar[10],Pomiar[11],Pomiar[12],Pomiar[13],Pomiar[14],Pomiar[15]);
MessageLength = sprintf(DataToSend, "%d:%d:%d:%dnr", Pomiar[0],Pomiar[1],Pomiar[2],Pomiar[3]);
CDC_Transmit_FS(DataToSend, MessageLength);
//HAL_Delay(1);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
настройки usart
static void MX_USART3_UART_Init(void)
{
/* USER CODE BEGIN USART3_Init 0 */
/* USER CODE END USART3_Init 0 */
/* USER CODE BEGIN USART3_Init 1 */
// huart3.Init.BaudRate = 115200;
/* USER CODE END USART3_Init 1 */
huart3.Instance = USART3;
// huart3.Init.BaudRate = 115200;
huart3.Init.BaudRate = 921600;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(amp;huart3) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART3_Init 2 */
/* USER CODE END USART3_Init 2 */
}
Ответ №1:
sprintf
выполняется очень медленно, и вы отправляете ASCII 5 цифр на выборку АЦП. Вы можете отправлять необработанные шестнадцатеричные данные по 2 байта на выборку для экономии полосы пропускания следующим образом
CDC_Transmit_FS(Pomiar, sizeof(Pomiar));