Чт мар 26, 2015 20:50:55
Вроде как всё правильно сделал, но в Протеусе не хочет работать...
Пт мар 27, 2015 09:28:08
//Программа инициализации АЦП
void adc_init()
{
ADMUX = (1<<REFS0); //выбираем источник питания АЦП 5v
ADMUX |= (0<<MUX0);
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADATE)|(1<<ADIE); //включаем АЦП с делителем = Fcpu/16
ADCSRA |= (1<<ADSC);
}
//
ISR(ADC_vect) //подпрограмма обработки прерывания от АЦП
{
//cli();
PORTD = 1;
buffer[i] = (ADCL + (ADCH<<8))-512;
i++;
count++;
if(count == BUF_SIZE) {cli(); i=0; count=0;}
PORTD = 0;
}
Пт мар 27, 2015 12:35:39
buffer[i] = (ADCL + (ADCH<<8))-512;
When an ADC conversion is complete, the result is found in these two registers.
When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently, if
the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read
ADCH. Otherwise, ADCL must be read first, then ADCH.
The ADLAR bit in ADMUX, and the MUXn bits in ADMUX affect the way the result is read from
the registers. If ADLAR is set, the result is left adjusted. If ADLAR is cleared (default), the result
is right adjusted.
int16_t tmp;
...
tmp=ADCL;
tmp|=((uint16_t)ADCH)<<8;
tmp-=512;
buffer[i]=tmp;
...
Пт мар 27, 2015 13:28:25
а почему бы не делать ПРАВИЛЬНО? вы пользуетесь WinAVR (или AVR-GCC), так почему не пользоваться для получения значения АЦП предопределенной переменной ADC? в CodeVision для аналогичных целей используется ADCW.YS писал(а):То есть, я бы написал как-то так:
- Код:
int16_t tmp;
...
tmp=ADCL;
tmp|=((uint16_t)ADCH)<<8;
tmp-=512;
buffer[i]=tmp;
int tmp = ADC - 512;
Пт мар 27, 2015 14:41:36
YS писал(а):Не совсем понял, про какие коэффициенты вы говорите.
Например имеем 512 отсчетов АЦП нужно посчитать мнимую и действительную части для 150Гц при частоте дискретизации 19200 Гц:
Пт мар 27, 2015 15:03:44
во вложении картинка с коэффициентами...
while k<1000 do
s_re=s_re+math.cos(2*math.pi*REL_FREQ*(k/1000))*signal[k];
s_im=s_im+math.sin(2*math.pi*REL_FREQ*(k/1000))*signal[k];
k=k+1;
end;
math.cos(2*math.pi*REL_FREQ*(k/N))
math.sin(2*math.pi*REL_FREQ*(k/N))
Пт мар 27, 2015 15:27:27
math.cos(2*math.pi*REL_FREQ*(k/N))
Пт мар 27, 2015 15:52:36
К примеру 8-е значение в таблице косинусов - 117, а у меня получается с округлением - 65...
Пт мар 27, 2015 16:39:09
YS писал(а):К примеру 8-е значение в таблице косинусов - 117, а у меня получается с округлением - 65...
Так абсолютные значения зависят от нормировки. Главное - вид функции. Постройте его массив, ваш массив, и сравните.
Пт мар 27, 2015 17:20:04
Пт мар 27, 2015 17:33:11
Пт мар 27, 2015 19:54:35
а почему бы не делать ПРАВИЛЬНО? вы пользуетесь WinAVR (или AVR-GCC), так почему не пользоваться для получения значения АЦП предопределенной переменной ADC?
Ткните просто меня носом, как он вычислил эти коэффициенты?...
SAMPLING_FREQ_HZ = 19200;
SINE_FREQ_HZ = 150;
SAMPLES_NO = 128;
timestep = 1/SAMPLING_FREQ_HZ;
sine_table = {};
k=0;
while k<SAMPLES_NO do
ph=2*math.pi*SINE_FREQ_HZ*k*timestep;
sine_table[k+1]=math.floor(127*math.sin(ph));
k=k+1;
end;
k=0;
while k<SAMPLES_NO do
io.write(sine_table[k+1] .. ",");
if ((k+1)%16)==0 then
print("");
end;
k=k+1;
end;
0,6,12,18,24,30,36,42,48,54,59,65,70,75,80,85,
89,94,98,102,105,108,112,114,117,119,121,123,124,125,126,126,
127,126,126,125,124,123,121,119,117,114,112,108,105,102,98,94,
89,85,80,75,70,65,59,54,48,42,36,30,24,18,12,6,
0,-7,-13,-19,-25,-31,-37,-43,-49,-55,-60,-66,-71,-76,-81,-86,
-90,-95,-99,-103,-106,-109,-113,-115,-118,-120,-122,-124,-125,-126,-127,-127,
-127,-127,-127,-126,-125,-124,-122,-120,-118,-115,-113,-109,-106,-103,-99,-95,
-90,-86,-81,-76,-71,-66,-60,-55,-49,-43,-37,-31,-25,-19,-13,-7
Сб мар 28, 2015 06:47:48
Сб мар 28, 2015 08:44:06
Сб мар 28, 2015 12:42:00
Сб мар 28, 2015 13:41:10
YS писал(а):Ага, бывает.
Только один вопрос - а зачем считать таблицу синуса на калькуляторе? Для этого, как вы видите, очень хорошо пригодны скриптовые языки. Очевидно, если мою программу сверху совсем немного доработать, можно получить на выходе готовую таблицу любого размера, причем уже в виде корректного массива, записанного по правилам Си или любого другого языка.
Вс мар 29, 2015 06:31:43
Вс мар 29, 2015 10:23:38
Вс мар 29, 2015 16:18:46
Вс апр 05, 2015 06:46:01