Jump to content

    
Sign in to follow this  
hd44780

Цифровой вольтметр-амперметр-ваттметр на AVR для бытовой сети

Recommended Posts

А, кстати, почему умножение занимает так много? Может ты в плавающей точке вычисления делаешь?

Нет, умножение было целочисленным. А много потому, что нет аппаратного умножителя, а програмно получается так много.

Edited by SHUR1K

Share this post


Link to post
Share on other sites
Нет, умножение было целочисленным. А много потому, что нет аппаратного умножителя, а програмно получается так много.

Страхи какие-то у вас :) Повсеместно использую целочисленное умножение типа 16 х 16 или 32 * 32, и никаких таких мегаразмеров программы не получается, как же так?

Share this post


Link to post
Share on other sites
Страхи какие-то у вас :) Повсеместно использую целочисленное умножение типа 16 х 16 или 32 * 32, и никаких таких мегаразмеров программы не получается, как же так?

16x16 и 32х32 - это совсем другое. Умножение на число, которое является степенью двойки - это просто сдвиг влево на соответствующие число позиций (степень двойки). А Вы попробуйте умножить на 11 или 13 и посмотрите как вырастет hex

Share this post


Link to post
Share on other sites
16x16 и 32х32 - это совсем другое. Умножение на число, которое является степенью двойки - это просто сдвиг влево на соответствующие число позиций (степень двойки). А Вы попробуйте умножить на 11 или 13 и посмотрите как вырастет hex

 

Ну и на сколько?

 

;*************************************************
;*      ;;/умножение Беззнаковых 16х16;;*       *
;*************************************************
Mul16x16:
        mul        temp,rab
        mov        R13,LoMul    ;| здесь AH*BH
        mov        R14,MeMul
        mul        temp1,rab1
        mov        R11,LoMul    ;| здесь AL*BL
        mov        R12,MeMul
        mul        temp,rab1    ;| здесь AH*BL
        add        R12,LoMul
        adc        R13,MeMul
        adc        R14,HiMUL
        mul        temp1,rab    ;| здесь BH*AL
        add        R12,LoMul
        adc        R13,MeMul
        adc        R14,HiMUL
        ret

Share this post


Link to post
Share on other sites
16x16 и 32х32 - это совсем другое. Умножение на число, которое является степенью двойки - это просто сдвиг влево на соответствующие число позиций (степень двойки). А Вы попробуйте умножить на 11 или 13 и посмотрите как вырастет hex

Проверил, умножил 1000 на 25, программа выросла на 80 байт, но это еще с учетом вызова функции itoa(), и где обещанные килобайты? :)

 

Share this post


Link to post
Share on other sites
16x16 и 32х32 - это совсем другое. Умножение на число, которое является степенью двойки - это просто сдвиг влево на соответствующие число позиций (степень двойки). А Вы попробуйте умножить на 11 или 13 и посмотрите как вырастет hex

Это что, первоапрельский прикол такой ? 16x16 это, простите, не умножение числа 16 на число 16, а перемножение двух произвольных 16-битных чисел. В один килобайт влезают четыре действия в плавучке и еще место останется, а уж целочисленное умножение при отсутствии команды mul - три-четыре десятка команд (меньше сотни байтов).

Share this post


Link to post
Share on other sites
Это что, первоапрельский прикол такой ? 16x16 это, простите, не умножение числа 16 на число 16, а перемножение двух произвольных 16-битных чисел. В один килобайт влезают четыре действия в плавучке и еще место останется, а уж целочисленное умножение при отсутствии команды mul - три-четыре десятка команд (меньше сотни байтов).

Прошу прощения, тупанул. Перепроверил у себя, при использовании в одном выражении деления и умножения код вырастает значительно. Если делать это не в одном выражении, то прирост действительно не так велик.

Share this post


Link to post
Share on other sites
Прошу прощения, тупанул. Перепроверил у себя, при использовании в одном выражении деления и умножения код вырастает значительно. Если делать это не в одном выражении, то прирост действительно не так велик.

Хм, что то у вас с компилятором, добавил деление в формуле, прирост чуть больше чем при умножении, что то у вас не так :) Проверьте настройки компилятора.

Share this post


Link to post
Share on other sites
Хм, что то у вас с компилятором, добавил деление в формуле, прирост чуть больше чем при умножении, что то у вас не так :) Проверьте настройки компилятора.

Нет, не с компилятором :-). Просто если использовать в одном выражении умножении и деление, ну например *3/2, то получается *1.5, а это уже дробное число, вот и растет код безбожно.

Share this post


Link to post
Share on other sites
Нет, не с компилятором :-). Просто если использовать в одном выражении умножении и деление, ну например *3/2, то получается *1.5, а это уже дробное число, вот и растет код безбожно.

?? мы говорили о целочисленном делении, разве нет? Если вы говорите о плавучке, тогда да, код раздувается на байт 800 примерно, но! Мы ведь говорили о целых числах :)

Share this post


Link to post
Share on other sites
?? мы говорили о целочисленном делении, разве нет? Если вы говорите о плавучке, тогда да, код раздувается на байт 800 примерно, но! Мы ведь говорили о целых числах :)

абсолютно правильно, мы говорили о целых числах. Просто я не обратил внимание на то, что при таких раскладах получаются дробные числа, чем ввел и себя и всех присутствующих в заблуждение. Так что, прошу прощения.

 

Share this post


Link to post
Share on other sites
...Просто если использовать в одном выражении умножении и деление, ну например *3/2, то получается *1.5, а это уже дробное число, вот и растет код безбожно...

абсолютно правильно, мы говорили о целых числах. Просто я не обратил внимание на то, что при таких раскладах получаются дробные числа, чем ввел и себя и всех присутствующих в заблуждение. Так что, прошу прощения.

*3/2 это целочисленная арифметика, а вот *1.5 - уже с плавающей точкой.

В первом случае никаких дробный чисел не будет, например 1*3/2=1, а не 1.5, как во втором случае.

Share this post


Link to post
Share on other sites

Разрешите вмешаться в интересную беседу о плавающей точке :rolleyes: .

Мне пока все равно, сколько оно места занимает. В обработчике прерывания суммы квадратов я считаю целочисленно, а потом, когда цикл измерений (20 мс - пероид 50 Гц) завершится, все дальнейшие расчеты с плавающей точкой.

Проц у меня сейчас ATMega16, на данный момент флэшки занято 47-48% - поэтому размер кода в настоящий момент совершенно не жмет :) . Когда все расчеты будут готовы, тогда займусь оптимизацией.

 

Калибровку я сделал, вольтметр показывает нормально.

Возникли вопросы о канале измерения тока.

 

Собрана схема - вложено. ОУ питаются от +5в и земли. Питание однополярное.

 

Когда ТТ (токовый транс) вообще отсутствует (он у меня подключается проводками через клеммник) - левая нога R4 висит в воздухе, то на выходе ОУ я вижу свое напряжение смещения (2.18в). Вроде нормально.

Когда я подключаю ТТ без нагрузки (или просто закорачиваю пинцетом вход R4 в землю), то сразу вижу на выходе ОУ 3.72в. Отнимаю смещение 3.72-2.18=1.54в. Откуда берутся эти 1.54в - я не понимаю :wacko: .

То же самое я наблюдаю и на канале напряжения, если я отключаю вход с обмотки и закорачиваю на землю.

 

Подключил нагрузкой свой паяльник 25W. На выходе транса вольтметр показал 0.035в= 35мВ. В пересчете это 0.1176А.

Амперметр показывает 0.11-0.12А. Т.е. сам ТТ работает нормально.

Но ОУ это напряжение совершенно не замечает - на выходе те самые 3.72в.

Наверное оно слишком мало. ОУ ведь неидеален :( .

Вот я и думаю - может организовать ему 2-полярное питание - вместо земли кинуть небольшое отриц. напряжение. Такая возможность есть - на трансе БП есть ср. точка.

Или взять другой ОУ. Есть у меня LF353.

Спасибо.

post-7980-1302073318_thumb.png

Edited by hd44780

Share this post


Link to post
Share on other sites
Когда ТТ (токовый транс) вообще отсутствует (он у меня подключается проводками через клеммник) - левая нога R4 висит в воздухе, то на выходе ОУ я вижу свое напряжение смещения (2.18в). Вроде нормально.

Когда я подключаю ТТ без нагрузки (или просто закорачиваю пинцетом вход R4 в землю), то сразу вижу на выходе ОУ 3.72в. Отнимаю смещение 3.72-2.18=1.54в. Откуда берутся эти 1.54в - я не понимаю :wacko: .

Ваше непонимание... Это же не инструментальный (дифференциальный) усилитель, а ОУ.

На самом деле, если резисторы, которые 10к были бы равны, то на выходе должно было быть удвоенное - 2.18*2.

Это потому, что на входах должно быть одинаковое напряжение.

Кроме всего прочего у Вас неправильно сделан канал измерения напряжения - входное сопротиление у инверитрующей схемы не бесконечность, а Ваш переменный резистор (10к) войдет сложным образом в коэффициент усиления.

Еще... ток в трансформаторы потечет, но небольшой...

Share this post


Link to post
Share on other sites

То что резисторы по факту разные я понимаю.

Собственно меня висящие входы мало интересуют. В готовом устройстве их не будет.

 

Меня больше волнует - надо ли заводить на ОУ отриц. питание, чтобы он мог работать с малыми сигналами на входе?

 

у Вас неправильно сделан канал измерения напряжения

 

А как правильно сделать?

Разделительные кондеры те поставить между делителем на трансе и резистором ОУ?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this