я тожеStarichok51 писал(а):это ты не в "ту степь" попал я считал по коду от Dimon456 для АТмеги.
primuss3.com
я тожеStarichok51 писал(а):это ты не в "ту степь" попал я считал по коду от Dimon456 для АТмеги.
Код: Выделить всё
volatile bool ain_status;
volatile uint16_t sum_u;
volatile uint16_t sum_i;
volatile uint16_t u_izm;
volatile uint16_t i_izm;
// ADC interrupt service routine
// with auto input scanning
ISR(ADC_vect)
{
static uint8_t count = 0;
static uint16_t adc_data[2]={0,0};
// Read the AD conversion result
adc_data[count%2] += ADCW;
if (count++ > ((63*2))) {
count = 0;
sum_u = adc_data[0]; adc_data[0]=0;
sum_i = adc_data[1]; adc_data[1]=0;
ain_status = 1;
}
// Select next ADC input
ADMUX=(0 | ADC_VREF_TYPE) + count%2;
// Delay needed for the stabilization of the ADC input voltage
_delay_us(10); // если требуется, если без нее будет работать то хорошо
// Start the AD conversion
ADCSRA|=(1<<ADSC);
}
// где-то в цикле while
if(ain_status) {
ain_status = 0;
u_izm = sum_u >> 3; // 13 bit
i_izm = sum_i >> 3;
}
Прерывание идет с частотой 104мкс, ну милли секунды ты же не отображаешь на экране.slav0n писал(а):и в моих проектах есть секундомер.
все равно у тебя, как и у меня, нет прибора, что бы измерить с точностью до 9 знака. Точно идут только DS3231.Starichok51 писал(а):мне не надо приближенное число прерываний за 1 секунду.
шум как раз накапливать не нужно, его нужно усреднять. За счет шума проявляется дробная часть разряда в пределах которого находится измеряемая величина. Но для этого шум должен быть с нормальным распределением(а не тот цифровой что проникает на вход контроллера) и усреднением он не теряется.здесь это не подходит, здесь надо накапливать шум
мало. Это аккуратно прямо впритык к необходимому, а надо чтобы надёжно перекрывало, ибо фильтр 1 порядка очень плавный. Поскольку тебе не надо измерять напряжение настолько быстро, можно фильтровать с частотой среза 10Гц.на входе стоит у меня фильтр - делитель 51к-10к и параллельно 10к конденсатор 220 нФ. то есть, постоянная времени около 2 мс, что соответствует предлагаемым тобой 500 Гц.
просто накапливать и усреднять шум нужно окном не короче 4^NAlexeyslav писал(а):шум как раз накапливать не нужно, его нужно усреднять. За счет шума проявляется дробная часть разряда в пределах которого находится измеряемая величина. Но для этого шум должен быть с нормальным распределением(а не тот цифровой что проникает на вход контроллера) и усреднением он не теряется.
Да вы, уж 10мкф поставьте и будем вам счастье, а лучше 200мкф или 4700мкф.Alexeyslav писал(а):можно фильтровать с частотой среза 10Гц.
Шум, не зависимо какой он носит характер, амплитудой к примеру 2милли вольта, а при режиме ограничения тока он может достигать 100 милли вольт, нельзя идентифицировать как полезный сигнал.Alexeyslav писал(а):даст вам дополнительную разрядность, уже не зависящую от наличия шума в исходном сигнале.
а если при этом полезный сигнал будет не менее 100 мВ, то почему нет?Dimon456 писал(а):Шум, не зависимо какой он носит характер, амплитудой к примеру 2милли вольта, а при режиме ограничения тока он может достигать 100 милли вольт, нельзя идентифицировать как полезный сигнал.
неправильно.Dimon456 писал(а):12 битный АЦП, 32768 отсчетов, получается 28 бит, сдвигаем на 3 бита, получаем 25 бит, чисто теоретически 15000000*1/16777216=0,8 микро ампера. Правильно или нет?
у тебя в первых двух видео 24 бита, а на экран выведено только 16 бит.Dimon456 писал(а):Верхняя строка сумма после сдвига на 5 бит
ну как же не важно.Dimon456 писал(а):slav0n, правильно, не правильно, не важно.
младшие 16 бит, блин, я только сейчас заметил, на верхнию строку выведен результат преобразованияStarichok51 писал(а):какие биты выведены и где остальные?
Код: Выделить всё
sum*15000000UL/(4096UL << 12)по чему мусор, как раз шум который нельзя идентифицировать как полезный сигнал.slav0n писал(а):первые два видоса показывают мусор
это и есть мусор, который бесполезно учитывать и тем более показыватьDimon456 писал(а):шум который нельзя идентифицировать как полезный сигнал.
ну вот, значит у оверсемплинга есть предел, бесполезно повышать количество отсчетов вытягивая разрядность оверсемплинга.slav0n писал(а):который бесполезно учитывать и тем более показывать
сколько тебе надо добавить бит, что бы померить микроамперы?Dimon456 писал(а):Микро амперы не удалось померить
у него там не 24 бита, а полная ерунда и хаос.Starichok51 писал(а):у тебя в первых двух видео 24 бита
А мне не кажется.Starichok51 писал(а):что-то мне кажется,
Код: Выделить всё
#define dsp_count 4UL // 1024 выборки
void DMA1_Channel1_IRQHandler(void)
{
static uint32_t avg_u;
static uint32_t avg_i;
static uint32_t avg_t_u;
static uint32_t avg_t_i;
static uint16_t count=0;
uint16_t *dp;
uint32_t irq; uint16_t n;
DMA1->IFCR = irq = DMA1->ISR & DDS_IRQ_MASK; /* Get and clear the irq flags */
dp = &ADC_values[(irq & DMA_ISR_TCIF1) ? ARRAYSIZE / 2 : 0]; /* Last or Half transfer? (determins which part of circular buffer to be filled) */
n = ARRAYSIZE / 4; /* Number of samples (fill half of the circular buffer) */
avg_u = 0; avg_i=0;
do {
avg_u += *dp; dp += 1;
avg_i += *dp; dp += 1;
} while (--n != 0);
avg_t_u += avg_u;
avg_t_i += avg_i;
if(count++ == (dsp_count-1)) {
ain[0] = avg_t_u;
ain[1] = avg_t_i;
ain_status = 1;
count=0; avg_t_u=0; avg_t_i=0;
}
}