Перейти к содержанию

sucess

Members
  • Постов

    17
  • Зарегистрирован

  • Посещение

Весь контент sucess

  1. подскажите пожалуйста как определить период затухающего сигнала в матлаб (не использовать преобразование Фурье)
  2. подскажите пожалуйста методы измерения параметров звуковых сигналов ( частота, громкость, время затухания, тембр ...)
  3. подскажите пожалуйста методы измерения параметров звуковых сигналов ( частота, громкость, время затухания, тембр ...)
  4. sucess

    Звуковые сигналы

    Помогите,какие алгоритмы измерения частоты, высоты звуковых синусоидальных сигналов с помощью микроконтроллера?
  5. sucess

    АЦ STM32

    у меная ацп 12-битный, почему на полученном графике 16 -битный. помогите !!!!
  6. sucess

    АЦП и ДМА на stm32vldiscovery

    Реализовать циклическое измерение напряжения на входе АЦП(ADC1_IN1 соответствует PA1) , цифровой код напряжения записывать в буфер, используя ДМА. Затем передать данные из буфера на ПК по юарт. Кто занет подскажите где в программе не правильно. #include "stm32f10x.h" #include "string.h" const unsigned int N=10; char rx_buf[10], rx_length=0; uint16_t adc_res; uint8_t rx_data; uint8_t tx_data; uint16_t adc_temp[10]={0}; uint8_t i; char RxBuffer[255]=""; char TxBuffer[255]=""; void AdcInit(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Разрешить тактирование порта PORTA GPIOA->CRL &= ~GPIO_CRL_MODE1; //Очистить биты MODE GPIOA->CRL &= ~GPIO_CRL_CNF1; //Очистить биты CNF RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //подаем тактирование АЦП RCC->CFGR &= ~RCC_CFGR_ADCPRE; //входной делитель ADC1->CR1 = 0; // ADC1->CR1 |= ADC_CR1_EOCIE; //enable interruption of eoc ADC1->SQR1 = 0; // ADC1->CR2 |= ADC_CR2_CAL; //запуск калибровки while (!(ADC1->CR2 & ADC_CR2_CAL)){}; //ждем окончания калибровки ADC1->CR2 = ADC_CR2_EXTSEL; //выбрать источником запуска разряд SWSTART ADC1->CR2 |= ADC_CR2_EXTTRIG; //разр. внешний запуск регулярного канала ADC1->CR2 |= ADC_CR2_CONT; //режим непрерывного преобразования ADC1->SQR3 = 1; //загрузить номер канала ADC1->CR2 |= ADC_CR2_ADON; //включить АЦП ADC1->CR2 |= ADC_CR2_SWSTART; //запустить процес преобразования NVIC_SetPriority(ADC1_IRQn, 2); NVIC_EnableIRQ(ADC1_IRQn); __enable_irq(); } void int_tim3(void) { RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;//Включаем тактирование TIM3 TIM3->PSC = 0x18; TIM3->ARR = 0x64; TIM6->DIER |= TIM_DIER_UIE; TIM3->CR1 |= TIM_CR1_CEN; } void init_dma_adc (void) { RCC->AHBENR |= RCC_AHBENR_DMA1EN; DMA1_Channel1->CPAR |= (uint32_t)&ADC1->DR; DMA1_Channel1->CMAR |= (uint32_t)&adc_temp[0]; DMA1_Channel1->CNDTR = 10; DMA1_Channel1->CCR = 0; DMA1_Channel1->CCR |= DMA_CCR1_DIR; DMA1_Channel1->CCR |= DMA_CCR1_MINC; DMA1_Channel1->CCR |= DMA_CCR1_CIRC; ADC1->CR2 |= ADC_CR2_DMA; DMA1_Channel1->CCR |= DMA_CCR1_EN; } void init_uart(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; RCC->APB2ENR |= RCC_APB2ENR_USART1EN; GPIOA->CRH &=~(GPIO_CRH_MODE9|GPIO_CRH_CNF9); GPIOA->CRH |= (GPIO_CRH_MODE9_1|GPIO_CRH_CNF9_1); USART1->BRR = 0x0D0;//0x9C4; // 9600Бит/с USART1->CR1 |= USART_CR1_TE; // Включение передатчика USART1 USART1->CR1 |= USART_CR1_RE; // Включение приемника USART1 USART1->CR1 |= USART_CR1_RXNEIE; USART1->CR1 |= USART_CR1_UE; NVIC_EnableIRQ(USART1_IRQn); } void USART1_Send(char chr) { while (!(USART1->SR& USART_SR_TC)); USART1->DR = chr; } int main(void) { init_uart(); AdcInit(); int_tim3(); init_dma_adc(); while(1) { } } void ADC1_IRQHandler(void) { DMA1_Channel1->CCR &=~ DMA_CCR1_EN; for (i=0; i != N;i++){ adc_res=adc_temp; USART1_Send((adc_res) & 0xFF); USART1_Send((adc_res >> 8) & 0x0F); } DMA1_Channel1->CNDTR = 10; DMA1_Channel1->CCR |= DMA_CCR1_EN; }
  7. первая строчка передается 8 младших битов, вторая 4 старших
  8. у меня нет Осциллографа, как частоту определить. на 100Гц, 200Гц, 300Гц такие получил
  9. синусоид 440Гц с телефона. С постоянным напряжением проверил, все правильно.
  10. Всё проверил, все правильно и получил как на картине. Знаете как фильтровать с помощью цифрового фильтров
  11. C5 убрал, результат не изменился. На ДМА не смог разобраться.
  12. если выход схемы не на АЦП подает, а прямо на компютер получили синусоид на программе Audacity. C5- разделительный конденсатор Комп нормально получил, не знаю почему отладчик не правильно показал.
  13. Помогите пожалуйста! Моя схема внизу. На входе электретный микрофон. Звуковой сигнал усиливается, смещается на 1,65В , фильтрируется и подается на АЦП отладочной платы STM32VLDISCOVERY. Никак не могу получить синусоид после UART. Программа на COOCOX IDE #include "stm32f10x.h" char rx_buf[10], rx_length=0; uint32_t adc_res; uint8_t n = 0x00; unsigned char rx_data; unsigned char tx_data; uint16_t i; const int CC = 2048; unsigned int counter=0; unsigned short arr[2048]; int windowSize = 100; void AdcInit(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; GPIOA->CRL &= ~GPIO_CRL_MODE1; GPIOA->CRL &= ~GPIO_CRL_CNF1; RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; RCC->CFGR &= ~RCC_CFGR_ADCPRE; ADC1->CR1 = 0; ADC1->CR1 |= ADC_CR1_EOCIE; ADC1->SQR1 = 0; ADC1->SQR3 = 1; ADC1->SMPR2 |=ADC_SMPR2_SMP1; ADC1->CR2 = ADC_CR2_EXTSEL; //выбрать источником запуска разряд SWSTART ADC1->CR2 |= ADC_CR2_EXTTRIG; ADC1->CR2 |= ADC_CR2_ADON; ADC1->CR2 |= ADC_CR2_CONT; ADC1->CR2 |= ADC_CR2_CAL; //запуск калибровки while (!(ADC1->CR2 & ADC_CR2_CAL)){}; ADC1->CR2 |= ADC_CR2_SWSTART; NVIC_SetPriority(ADC1_IRQn, 2); NVIC_EnableIRQ(ADC1_IRQn); __enable_irq(); } void init_uart(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; RCC->APB2ENR |= RCC_APB2ENR_USART1EN; GPIOA->CRH &=~(GPIO_CRH_MODE9|GPIO_CRH_CNF9); GPIOA->CRH |= (GPIO_CRH_MODE9_1|GPIO_CRH_CNF9_1); USART1->CR1 |= USART_CR1_UE; USART1->BRR = 0x0D0;//0x9C4; // 9600Бит/с USART1->CR1 |= USART_CR1_TE; // Включение передатчика USART1 USART1->CR1 |= USART_CR1_RE; // Включение приемника USART1 USART1->CR1 |= USART_CR1_RXNEIE; } void USART1_Send(char chr) { while (!(USART1->SR& USART_SR_TXE)); USART1->DR = chr; } void delay(uint32_t i) { volatile uint32_t j; for (j=0; j!= i * 1000; j++); } int main(void) { init_uart(); AdcInit(); smooth(); while(1) { send(); } } //adc interruption... unsigned short data_adc; void ADC1_IRQHandler(void) { data_adc = ADC1->DR; arr[counter++]= data_adc; if (counter > CC-2) { counter = CC-1; ADC1->CR2 &= ~ADC_CR2_ADON; } ADC1->SR |= ADC_SR_EOC; } void smooth(void) { int k; unsigned short sum = 0; unsigned short movingAverage = 0; if (counter > CC-2) { for ( k = 0; k<= (CC-windowSize);k++) { int g; sum = 0; for (g = k; g < k+windowSize; g++) { sum += arr[g]; } movingAverage = sum/windowSize; arr[k] = movingAverage; } } } void send(void){ if (counter > CC-2) { for (i = 0; i < CC-windowSize; i++) // for (i = 0; i < CC; i++) { USART1_Send((char)((arr) & 0xFF)); USART1_Send((char)((arr >> 8) & 0x0F)) ; } counter = 0; ADC1->CR2 |= ADC_CR2_ADON; ADC1->CR2 |= ADC_CR2_SWSTART; } Программа для построения данных с UART //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "CommPort" #pragma resource "*.dfm" TForm2 *Form2; //--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { CommPort1->Open = true; but_stop = 0; } //--------------------------------------------------------------------------- unsigned short data; int count_data = 0; void __fastcall TForm2::CommPort1DataReceived(TObject *Sender, DWORD Count) { if (Count == 0) { return; } static int status = 0; unsigned char temp; DWORD count_temp = 0; while (count_temp++ < Count) { temp = CommPort1->GetChar(); switch(status) { case 0x00 : data = temp; status = 0x01; break; case 0x01 : data |= temp >> 8; status = 0x00; if (!but_stop) { Chart1->Series[0]->AddXY(count_data++, data); } break; } // else { // data = temp; // } } } //--------------------------------------------------------------------------- void __fastcall TForm2::Button1Click(TObject *Sender) { but_stop = ~but_stop; } //--------------------------------------------------------------------------- void __fastcall TForm2::Button2Click(TObject *Sender) { Chart1->Series[0]->Clear(); } //---------------------------------------------------------------------------
×
×
  • Создать...