Jump to content

    

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

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

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

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this