

smk
Свой-
Posts
2,398 -
Joined
-
Last visited
Reputation
0 ОбычныйAbout smk
-
Rank
Гуру
- Birthday 08/20/1971
Контакты
-
Сайт
Array
-
ICQ
Array
Информация
-
Город
Array
Recent Profile Visitors
7,375 profile views
-
Оно и работает. Только в смеси с другими частотами плохо определяет. Во так сейчас: int main() { Init(); K = (int) (0.5 + ((buffer_size * FDETECT) / FS)); W = (2.0 * Pi * K) / buffer_size; cosine = cos(W); sine = sin(W); coefficient = 2 * cos(W); K5 = (int) (0.5 + ((buffer_size * FDETECT5) / FS)); W5 = (2.0 * Pi * K5) / buffer_size; cosine5 = cos(W5); sine5 = sin(W5); coefficient5 = 2 * cos(W5); scalingFactor = buffer_size / 2.0; while(1){ DMA1_Channel1->CNDTR = (sizeof sampl)/2; DMA1_Channel1->CCR |= DMA_CCR1_EN; while (!(DMA1->ISR & DMA_ISR_TCIF1)) __NOP(); DMA1->IFCR |= DMA_IFCR_CGIF1; DMA1_Channel1->CCR &= ~DMA_CCR1_EN; for(i = 0; i < buffer_size; i++){ samples[i] = (int)(sampl[i] - 2047); } Q0 = 0; Q1 = 0; Q2 = 0; for (i=0 ; i<buffer_size ; i++) { Q0 = samples[i] + (coefficient * Q1) - Q2; Q2 = Q1; Q1 = Q0; } real = (Q0 - (Q1 * cosine)) / scalingFactor; imag = (- Q1 * sine) / scalingFactor; magnitude = sqrt(real * real + imag * imag); Q0 = 0; Q1 = 0; Q2 = 0; for (i=0 ; i<buffer_size ; i++) { Q0 = samples[i] + (coefficient5 * Q1) - Q2; Q2 = Q1; Q1 = Q0; } real5 = (Q0 - (Q1 * cosine5)) / scalingFactor; imag5 = (- Q1 * sine5) / scalingFactor; magnitude5 = sqrt(real5 * real5 + imag5 * imag5); if(magnitude > 100) {status |= 0x1; } else {status &= ~0x1; } if(magnitude5 > 100) {status |= 0x2; } else {status &= ~0x2; } }
-
Да, я так и сделал. Беру выборку, обрабатываю. Заткм следующую беру.
-
float FS = 4000.0; float Fin = 900.0
-
Пример работает. Вопрос как заплоненный ДМА буфер (16 бит) правильно подставить. float Kor = (FS/Fin)/(2*Pi); for(int i = 0; i < buffer_size; i++){ samples[i] = (sin(i/Kor))* 1000 + DC_offset; Вот сюда. DC_offset у меня пол питания.
-
Начинал. Надо понять как должно быть. как понять работает или нет? Нужен рабочий пример на котором я все увижу. Дальше разберусь.
-
С изменениями разобрался. Всеравно не то. Пример бы рабочий.
-
Вот как это понимать? Оно еще и изменяется
-
F103 sine = sin(W); - неправильно считает
-
А есть пример рабочего кода? Повторить и посмотреть как работает.
-
ДМА ложит 16 бит, а double samples[buffer_size]; больше бит. Не соображу как приведение типов сделать. Как-то так. Но зачение magnitude вообще как-то непонятно что отражает double FS = 4000.0; // double FDETECT = 1000.0; // nsigned char f=0; void DMA1_Channel1_IRQHandler (void){ unsigned short i; DMA1_Channel1->CCR &= ~DMA_CCR1_EN; DMA1->IFCR |= DMA_IFCR_CGIF1; for (i=0; i<buffer_size; i++) { Q0 = (double)samples1[i] + (coefficient * Q1) - Q2; Q2 = Q1; Q1 = Q0; } f = 1; DMA1_Channel1->CCR |= DMA_CCR1_EN; } int main (void) { SystemCoreClockUpdate (); Init (); InitTest (); while(1) { if(f != 0){ real = (Q0 - (Q1 * cosine)) / scalingFactor; imag = (- Q1 * sine) / scalingFactor; magnitude = sqrt(real * real + imag * imag); f = 0; } } }
-
Понимаю ДМА. Делаю.
-
void Init_ADC (void){ RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; GPIOA->CRL &= ~GPIO_CRL_MODE0; GPIOA->CRL &= ~GPIO_CRL_CNF0; TIM3->CR2 |= TIM_CR2_MMS_1; TIM3->PSC = 9-1; TIM3->ARR = 2000; RCC->CFGR |= RCC_CFGR_ADCPRE_0; ADC1->CR2 |= ADC_CR2_EXTTRIG; ADC1->CR2 |= ADC_CR2_EXTSEL_2; ADC1->CR2 |= ADC_CR2_CONT; ADC1->CR2 |= ADC_CR2_ADON; TIM3->CR1 |= TIM_CR1_CEN; } По первому вопросу так и есть.
-
#define PI 3.14159265358979323846 #define buffer_size 2000 double samples[buffer_size]; double magnitude; double samples1; double FS = 4000.0; // double FDETECT = 1000.0; // int K; double coefficient; double W; double sine; double cosine; double Q0, Q1, Q2; double real; double imag; double magnitude; double scalingFactor; int i; void InitTest (){ K = (int) (0.5 + ((buffer_size * FDETECT) / FS)); W = (2.0 * PI * K) / buffer_size; cosine = cos(W); sine = sin(W); coefficient = 2 * cos(W); scalingFactor = buffer_size / 2.0; Q0 = 0; Q1 = 0; Q2 = 0; } void TestCalk (double samples){ for (i=0; i<buffer_size; i++) { Q0 = samples + (coefficient * Q1) - Q2; Q2 = Q1; Q1 = Q0; } real = (Q0 - (Q1 * cosine)) / scalingFactor; imag = (- Q1 * sine) / scalingFactor; magnitude = sqrt(real * real + imag * imag); } int main (void) { SystemCoreClockUpdate (); Init (); InitTest (); while(1) { if(ADC1->SR & ADC_SR_EOC) { samples = ADC1->DR; TestCalk (samples); } } } Что я делаю неправильно?
-
В каком виде подставлять? Вот прямо как оцифровано? И еще момент. Там есть постоянная составляющая в 1/2 питания. Подставлять я так понимаю с частотой дискретизации? И еще момент. Надо одновременно две частоты отслеживать. 500 и 1000.
-
Как это использовать? void SampleFilter_init(SampleFilter* f) { int i; for(i = 0; i < SAMPLEFILTER_TAP_NUM; ++i) f->history[i] = 0; f->last_index = 0; } void SampleFilter_put(SampleFilter* f, double input) { f->history[f->last_index++] = input; if(f->last_index == SAMPLEFILTER_TAP_NUM) f->last_index = 0; } double SampleFilter_get(SampleFilter* f) { double acc = 0; int index = f->last_index, i; for(i = 0; i < SAMPLEFILTER_TAP_NUM; ++i) { index = index != 0 ? index-1 : SAMPLEFILTER_TAP_NUM-1; acc += f->history[index] * filter_taps[i]; }; return acc; }