у меня был датчик оборотов, у ТС вольтметр постоянного тока - там 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. ему рэйл-ту-рэйл подавай за тыщю рупий. на меньшее он не согласен. послушал, послушал я этих прекрасных людей, сделал выводы об ихних ментальных способностях и отослал их всех на йух в печду)) всю полезную инфу дали нормальные люди, мудаков с хворумов слушать смысла совсем нетути...
пришил третью голову с правого боку. хоть и говорят, что две головы хорошо, а три уже не красиво)) Спойлер Спойлер
_________________ душа человеческая темна и с легкостью обращается ко злу
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения