Помогите пожалуйста!
Моя схема внизу. На входе электретный микрофон. Звуковой сигнал усиливается, смещается на 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();
}
//---------------------------------------------------------------------------