COKPOWEHEU писал(а):В смысле "где"?
slav0n писал(а):а где же аппаратный ШИМ? где разгрузка ядра?..
primuss3.com
COKPOWEHEU писал(а):В смысле "где"?
slav0n писал(а):а где же аппаратный ШИМ? где разгрузка ядра?..
Код: Выделить всё
/* ADC */
#define ADCW _SFR_IO16(0x04)
#ifndef __ASSEMBLER__
#define ADC _SFR_IO16(0x04)
#endif
#define ADCL _SFR_IO8(0x04)
#define ADCH _SFR_IO8(0x05)там 2 8-битных регистра (видно в даташите) - старший и младший.Dimon456 писал(а):Теперь вопрос: у мк действительно 16 битный регистр ADCW есть? Или это два 8 битных регистра? и что бы записать АЦП в них потребуется более чем 1 такт? а вам считать из него белее чем 1 такт?
Ни возникнет конфликта зипись-чтение и искажение результата?
Поправьте ссылку, а то сейчас она ведет на заготовку кода с cvavr'ным мусором.Следовательно ваш алгоритм ни чем не отличается от моего предложенного ранее.
Очередное преобразование начинается после чтения ADCH. То есть если нам нужна вся 10-битная точность, читаем сначала ADCL, потом ADCH (в Си можно читать сразу 16-битный ADC, он сам разберется). Если достаточно 8-битной, читаем только ADCH.что бы записать АЦП в них потребуется более чем 1 такт? а вам считать из него белее чем 1 такт?
Ни возникнет конфликта зипись-чтение и искажение результата?
Это на каком мк?COKPOWEHEU писал(а):Не в начале, а в конце, константа ADC_TIME_TIMER как раз отвечает за то, на сколько тактов старт АЦП возникнет раньше импульса ШИМ.
Код: Выделить всё
#define ADCSRA_START (1<<ADEN | 1<<ADSC | 1<<ADFR | 0b110 << ADPS0) //F_CPU/64
ADCSRA = ADCSRA_START;Это на каком мк?COKPOWEHEU писал(а):Очередное преобразование начинается после чтения ADCH
Но вы-то писали про алгоритм измерения, а не про нечитаемые продукты cvavr'а.И ссылка правильно ведет, единственный генератор начального кода, только код малость неправильный.
Да. Сейчас перечитал:Вы ошибаетесь. Запуск преобразования не связан с чтением/не чтением значений регистров данных АЦП.
То есть при чтении ADCL регистровая пара блокируется до момента чтения ADCH.When ADCL is read, the ADC Data Register is not updated until ADCH is read
Код: Выделить всё
// ADC Clock frequency: 125,000 kHz
//ADC Auto Trigger Source: Free Running
ISR(ADC_vect)
{
static uint8_t count = 1;
if(count==3){
adc_data[0] = ADCW;
ADMUX = (0<<REFS1)|(1<<REFS0)| (0<<MUX0);//set ch 0
PWM_pin_clr();//сброс выхода
}
if(count==9) {
adc_data[1] = ADCW;
ADMUX = (0<<REFS1)|(1<<REFS0)| (1<<MUX0);//set ch 1
PWM_pin_set();//установка выхода
}
if(count++>9) count=1;
}
да и код мой уже замусолили и так и эдак...#define ADCW _SFR_IO16(0x04)
#define ADCH _SFR_IO8(0x05)
Теста в реальном устройстве.slav0n писал(а):но для реального использования в нем все-таки кой чего не хватает... чего?
Код: Выделить всё
u32 V_sum, A_sum;
u16 period, pulsewidth;
u8 A_round, V_round;
ISR(TIMER1_OVF_vect)
{
if(ADMUX & (1<<MUX0)){
A_sum += ADCW;//get ch 1
ADMUX = (1<<REFS1)|(1<<REFS0)| (0<<MUX0);//set ch 0
PWMpin_clr();//сброс выхода
ICR1 = period - pulsewidth;
A_round++;
}else{
V_sum += ADCW;//get ch 0
ADMUX = (1<<REFS1)|(1<<REFS0)| (1<<MUX0);//set ch 1
PWMpin_set();//установка выхода
ICR1 = pulsewidth;
V_round++;
}
}ну чего ты докопался до этого таймера?slav0n писал(а):но прежде:
За чем? Если есть возможность синхронизировать, за чем отказываться.slav0n писал(а):я показал не синхронизацию
slav0n писал(а):а способ фильтрации помех средним арифметическим.
Код: Выделить всё
A_sum += ADCW;
A_round++;ну же, прояви фантазию, ты же можешь.Dimon456 писал(а):а где дальше?
