у меня был датчик оборотов, у ТС вольтметр постоянного тока - там 0 не добиться, а чтобы начать мерять в обе стороны схему придётся усложнять и ему и мне... но даже и в этом случае выходной диапазон с обеих сторон на х-1 подрезается (где х - делитель).
так ведь и это не поможет... (предлагаешь ТСу с батарейкой ходить, чтоб вольтметр до 0 сбрасывать?
а мне наверно проще было под экранчиком табличку сделать "если показания упали до 16 - вал остановлен" так чтоли? так ведь вал может и не быть остановлен, а уже снова раскрутиться до 32 об/мин (при коэффициенте фильтрации 17)...
хотя в том случае я применил и не БИХ, а КИХ фильтр с длиной равной количеству зубьев на венце вала - так он очень хорошо подавляет джиттер, вызванный неравномерным расположением зубьев на валу.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
у и как эта твоя фигня работает? если 0xEC после арифметического сдвига вправо сразу дают 0xF6, без всяких sbrc r24, 7 и без всяких subi r24, 0xFF ; 255 ?
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
а при чем тут он? это ты привел код четырех вариантов и для каждого варианта написал "работает" или "не работает". а я тебе показал, что твой "работает" работать не может, так как дает ошибочный результат.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Вот без последующего сложения[spoiler]Исходные данные
Код:
volatile uint8_t temp; temp = -20; (0xEC)
Во всех случаях ожидаю на выходе увидеть число -10 (0xF6) Правильный результат получается только при явном приведении типов.
Думаю проблема в том, что Вы пытаетесь присвоить беззнаковому отрицательное значение, в результате temp принимает не -20, а 236 и явное приведение превращает это в -20
вот так оно это выглядит Спойлер диапазон питающего от +15...35в от импульсного, при этом тянет от 75 до 120ма, от меньшего больше. Спойлер пульсации питающего +5в и опорного +4в5 Спойлер измерение входного постоянного напряжения и тока около 30а Спойлер нулёвый ток Спойлер ток около 100а Спойлер
_________________ душа человеческая темна и с легкостью обращается ко злу
//---------- unsigned int Digit[8]; //массив переменных Digit (8 разрядов led-драйвера) unsigned char dt_in[8]; //массив беззнаковых символьных переменных dt_in из 8 переменных (адреса rg и данные dt для led-драйвера)
unsigned char n; //символьная переменная (максимальное количество разрядов led-драйвера n=0,...n=7) unsigned int count; //переменная счётчика основных циклов
unsigned char V; //переменная для передачи разложенной величины измеренного напряжения в led-драйвер unsigned char I; //переменная для передачи разложенной величины измеренного тока в led-драйвер
unsigned int adc_value; //10-битный результат ацп-преобразования adc_code
float dt_v; //результат преобразования adc_code канала mux_4 в измеренное напряжение [V] float Av; //Av=dt_v - входной параметр (Vin) сглаживающего фильтра в канале [V] float Mv; //выходной параметр (Vavr_out) сглаживающего фильтра в канале [V] float Mv1 = 0; //сброс промежуточного (Vavr) результата работы сглаживающего фильтра в канале [V] float Ks_v = 0.025; //коэффициент сглаживания в канале [V]
float dt_i; //результат преобразования adc_code канала mux_3 в измеренный ток [I] float Ai; //Ai=dt_i float Mi; //окончательный результат работы сглаживающего фильтра в канале [I] float Mi1 = 0; //сброс промежуточного результата работы сглаживающего фильтра в канале [I] float Ks_i = 0.025; //коэффициент сглаживания в канале [I]
//--- функция побитовой отправки данных в драйвер max7219 --- void Send_max7219(unsigned char rg, unsigned char dt) { unsigned char rg_copy; //копия значения переменной rg unsigned char i; //переменная для побитной отправки данных в драйвер индикаторов
DRV_CS_0; //отправим «0» на вывод CS микросхемы MAX7219, чтобы начать процесс передачи адреса и данных asm("nop"); //пауза в 1 такт
for(i=0;i<8;i++) //цикл от 0 до 7 с шагом 1, для побитовой отправки байта адреса в микросхему MAX7219 { if((rg & 0x80)==0x80) //пока rg * 0b1000 0000 > 0, ... { DRV_DT_1; //...отправим 1 на вывод Din микросхемы MAX7219 } else //если же rg * 0b1000 0000 = 0, ... { DRV_DT_0; //...отправим 0 на вывод Din микросхемы MAX7219 }
//создадим тактовый импульс на выводе CLK микросхемы MAX7219 asm("nop"); //пауза в 1 такт DRV_CLK_1; //отправим 1 на вывод Clk микросхемы MAX7219 asm("nop"); //пауза в 1 такт DRV_CLK_0; //отправим 0 на вывод Clk микросхемы MAX7219 rg <<= 1; //сдвинем значение переменной rg на 1 бит влево } //выйдем из цикла когда i станет равной 7, т.е. когда отправка байта адреса в микросхему MAX7219 будет окончена
for(i=0;i<8;i++) //цикл от 0 до 7 с шагом 1, для побитовой отправки байта данных в микросхему MAX7219 { if((dt_in[rg_copy] & 0x80)==0x80) //пока rg * 0b1000 0000 > 0, ... { DRV_DT_1; //...отправим 1 на вывод Din микросхемы MAX7219 } else //если же rg * 0b1000 0000 = 0, ... { DRV_DT_0; //отправим 0 на вывод Din микросхемы MAX7219 }
//создадим тактовый импульс на выводе CLK микросхемы MAX7219 asm("nop"); //пауза в 1 такт DRV_CLK_1; //отправим 1 на вывод Clk микросхемы MAX7219 asm("nop"); //пауза в 1 такт DRV_CLK_0; //отправим 0 на вывод Clk микросхемы MAX7219 dt_in[rg_copy] <<= 1; //сдвинем значение переменной DRV_MOSI на 1 бит влево } //выйдем из цикла когда i станет равной 7, т.е. когда отправка байта данных в микросхему MAX7219 будет окончена DRV_CS_1; //отправим «1» на вывод CS микросхемы MAX7219, чтобы завершить процесс передачи адреса и данных }
//--- инициализация драйвера max7219 --- void MAX7219_ini(void) { Send_max7219(0x09,0xFF); //(номер регистра rg, данные dt) включаем режим BCD code B, для 0-7 разрядов Send_max7219(0x0A,0x0A); //DC = 21/32 яркость свечения Send_max7219(0x0B,0x07); //число используемых разрядов (0-7 разрядов) Send_max7219(0x0C,0x01); //отключаем режим энергосбережения (Shutdown)
for(n=1;n<9;n++) { Send_max7219(n,0x0F); //гасим все разряды драйвера дисплея V/A до момента вывода информации } }
//--- функция вывода значений на display_1 (вольтметр 00.0v) --- void ledprint_1(unsigned int number) //number - величина измеренного напряжения Mv { if((float)dt_v < 998) //если Mv < 99.8, то выводим на дисплей результат... { Digit[8]=number/100 ? number/100 : 0x0F; //сотни /гасим старший незначащий нуль Digit[7]=number%100/10; //десятки Digit[7]=Digit[7]|0x80; //вкл децимальную точку в разряде Digit_7 Digit[6]=number%10; //единицы Digit[5]=0x0F; //blanking digit_5 } else //...в противном случае, выводим на дисплей 0L (overload) { Digit[8]=0x0F; //blanking digit_8 Digit[7]=0x00; //<<0>> Digit[6]=0x0D; //<<L>> Digit[5]=0x0F; //blanking digit_5 }
adc_value = ADC_Conv(4); // - считаем результат ацп-преобразования канала mux_4 dt_i = ADCI_Conv(); //преобразуем результат в величину измеренного тока [I]
Ai=dt_i; // Mi = Ks_i * Ai + Mi1 * (1-Ks_i); //фильтр Кальмана Mn=Ks*An + Mn1*(1-Ks) Mi1=Mi; // _delay_us(10);
count++; //инкрементируем счётчик основного цикла if(count==3000) //обновляем информацию на индикаторах в каждом 3 000 цикле { count=0; //сброс счётчика циклов ledprint_1(Mv); //отправим значение в функцию вывода на индикатор вольтметра ledprint_2(Mi); //отправим значение в функцию вывода на индикатор амперметра } } }
в качестве опорного напряжения Vref = +4.1v для внутренего ацп атмеги используеца просто напряжение питания +5в это выходное напряжение чёпера +24v >>+5v на микре mcp34063 деленое синим подстроешником 3296w. палаумные и не столь отдалёные экз_п-п-перды громко пердели про "ацкую нестабильность этого гавна 34063". один прохесионал пёрнул про то, что, якобы, синии-синии подсроешники 3296 "текут"!!! текут, бл! хоть стой хоть падай. ослы ебаные понакупили совковых депломов, но как были ослами, так ими же и остались. следующий удолбаный ёб смешал с грязью достойную микру tl082. ему рэйл-ту-рэйл подавай за тыщю рупий. на меньшее он не согласен. послушал, послушал я этих прекрасных людей, сделал выводы об ихних ментальных способностях и отослал их всех на йух в печду)) всю полезную инфу дали нормальные люди, мудаков с хворумов слушать смысла совсем нетути...
пришил третью голову с правого боку. хоть и говорят, что две головы хорошо, а три уже не красиво)) Спойлер Спойлер
_________________ душа человеческая темна и с легкостью обращается ко злу
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения