Перейти к содержанию
    

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

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

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

Изменено пользователем SHUR1K

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разрешите вмешаться в интересную беседу о плавающей точке :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

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...