Страница 1 из 7
Вольтметр переменного тока
Добавлено: Чт май 29, 2014 23:24:13
СЦБист
Решил собрать простенький вольтметр переменного тока.
В голову пришла такая идея.
Напряжение на АЦП МК подаю с делителя . На резисторе 1кОм будет выделятся амплитудное значение за счет конденсатора.
Это напряжение запоминаю МК, потом умножаю на 62 (коэффициент делителя) - и делю на 1,41 что=бы узнать действующее значение напряжения в сети.
Что скажите уважаемые коты?
Re: Вольтметр переменного тока
Добавлено: Чт май 29, 2014 23:55:22
Enman
Это не амплитудное значение, а средневыпрямленное, коэф = Pi/ 2корня из 2х (1,11, где-то)....
Re: Вольтметр переменного тока
Добавлено: Пт май 30, 2014 00:00:11
СЦБист
на выходе моста будет пульсирующее напряжение с амплитудой 310 В
На резисторе 1к амплитудное значение будет 5В - потолок. ИОН для АЦП тоже 5В.
Кондер должен зарядится до этого значения. Действующее равно амплитуда на корень 2
Re: Вольтметр переменного тока
Добавлено: Пт май 30, 2014 00:04:10
Enman
Это ты себя убеждаешь?....
Тогда лучше ТОЭ в руки...

...и спать с такой книгой лучше...
Амплитуда у тебя будет, если конденсатор на 400 В поставишь....

Re: Вольтметр переменного тока
Добавлено: Пт май 30, 2014 10:18:19
СЦБист
Короче смысл в следующем.
Делаю в течении 20 мс через каждую 1мс оцифровку аналогового сигнала на резисторе 1 к.
Создаю массив и нахожу максимальное значение.
Зная максимальное значение (амплитудное) - нахожу действующее.
Так понятно ?
Кондер может даже и не нужен - поставлю керамику в качестве защиты от помех.
Re: Вольтметр переменного тока
Добавлено: Пт май 30, 2014 13:07:33
Enman
да мне. собственно, и ранее было понятно (правда, только для синуса. а не того, что в сети бывает)...

....не я же тему создавал...)))
Re: Вольтметр переменного тока
Добавлено: Пт май 30, 2014 14:19:10
СЦБист
Программу собираюсь писать на ассемблере.
Вот только не в курсах как создать массив с помощью ОЗУ.
Вроде там надо применять регистровую пару.
Знаю только, что-бы что-то записать в ОЗУ есть команда sts, что-бы считать в РОН lds.
Кто знает как это сделать? С помощью каких команд?
Re: Вольтметр переменного тока
Добавлено: Пт май 30, 2014 14:27:09
akl
Спойлер

обмен с RAM.GIF
Re: Вольтметр переменного тока
Добавлено: Пт май 30, 2014 15:16:06
СЦБист
Спасибо конечно за таблицу. И как теперь сварганить масив? Есть примеры использования этих команд?
С английским конечно туго.
Например я под переменную Digit занимаю 10 ячеек ОЗУ
.dseg
Digit: .byte10
Как записывать что-то в ОЗУ из РОН я знаю.
sts Digit, R16 - запись в 0-ю ячейку
sts Digit+1, R16 - запись в 1-ю ячейку
..................
Считывал так
lds R16, Digit
lds R17, Digit+1
Как пользоваться другими командами?
........
ldi ZH,High(Digit*2) ;загрузка начального адреса массива
ldi ZL,Low(Digit*2)
Правильно ли я загрузил начальный адрес массива Digit ? Нужно-ли писать Digit*2 ?
Re: Вольтметр переменного тока
Добавлено: Пн июн 02, 2014 20:12:32
ДУРАК
А готовый купить проблема?

Re: Вольтметр переменного тока
Добавлено: Пн июн 02, 2014 23:31:40
СЦБист
хочу сам собрать воспользовавшись приобретенными знаниями в академии.
Re: Вольтметр переменного тока
Добавлено: Ср июн 04, 2014 13:11:11
orinoko
СЦБист писал(а):
ldi ZH,High(Digit*2) ;загрузка начального адреса массива
ldi ZL,Low(Digit*2)
Правильно ли я загрузил начальный адрес массива Digit ? Нужно-ли писать Digit*2 ?
Неправильно. Тут на 2 умножать не надо. Поставим теперь вопрос по другому - а зачем нужен массив? Нужно просто суммировать получаемые данные. После получения, например, 20-го значения, произвести расчёт и обнулить сумму. И всё - ждём дальше. Не забываем, что число у нас будет 3-байтное
Re: Вольтметр переменного тока
Добавлено: Ср июн 04, 2014 14:11:58
СЦБист
СЦБист писал(а):3-байтное
АЦП буду использовать 8 разрядов. ОЗУ же 8 розрядное.
СЦБист писал(а):Тут на 2 умножать не надо.
почему не надо ? адрес ячейки ОЗУ же 2 байта
с помощью массива буду сравнивать значения м-ду собой и найду из них наибольшее.
Re: Вольтметр переменного тока
Добавлено: Ср июн 04, 2014 15:53:46
orinoko
Умножать надо только при обращении к таблице в памяти программ. Это связано с особенностями адресации именно там. Для обращения к ОЗУ этого делать не надо, и это не зависит от двухбайтности адреса ОЗУ. Тем более, что проверяется это за 5 минут в Студии.
И, чтобы узнать максимум, незачем хранить все значения, а определять этот максимум в процессе получения данных.
Re: Вольтметр переменного тока
Добавлено: Ср июн 04, 2014 16:13:14
СЦБист
СЦБист писал(а):Тем более, что проверяется это за 5 минут в Студии.
всмысле ?

Re: Вольтметр переменного тока
Добавлено: Ср июн 04, 2014 16:22:00
orinoko
набросать код, запустить на пошаговое выполнение, и посмотреть куда идёт обращение. Причём достаточно 3 команды
Re: Вольтметр переменного тока
Добавлено: Ср июн 04, 2014 16:57:56
СЦБист
Можно брать любые регистровые пары X, Y, Z ?
а можно сделать двухбайтные элементы массива ?
Re: Вольтметр переменного тока
Добавлено: Ср июн 04, 2014 17:08:58
orinoko
пары любые. А элементы можно делать хоть 32-байтные. всё зависит от задачи и необходимости для программиста и умения работать с данными числами. У меня например были 5-байтные числа, которое мне нужно было делить на однобайтное.
Re: Вольтметр переменного тока
Добавлено: Ср июн 04, 2014 18:17:12
СЦБист
и как же считывать их из ОЗУ при помощи X Y Z ?
РОН ведь однобайтный.
к примеру элементы массива занимают два байта.
как в таком случае быть ?
Re: Вольтметр переменного тока
Добавлено: Ср июн 04, 2014 18:41:09
orinoko
Регистровая пара X/Y/Z - это 16-битный указатель. В нём записывается адрес ячейки
ldi ZH, High(Digit) ;загрузка начального адреса массива
ldi ZL, Low(Digit)
Далее программист сам решает, в какой ячейке РОН хранить мл. байт, а в какой - старший. Это чистая условность. Например
sts Digit, R16 - запись в 0-ю ячейку <- пусть это старший байт
sts Digit+1, R17 - запись в 1-ю ячейку <- пусть это младший байт
lds R16, Digit
lds R17, Digit+1
Для удобства я наваял набор макросов для работы с 2-байтными числами и забыл про неудобства. Правда, работают только с X/Y/Z. Например
; Загрузка 2-байтного числа из памяти в парный регистр
.MACRO ldsw
lds @0L, (@1+1)
lds @0H, @1
.endm
; Сохранение 2-байтного числа из парного регистра в память
.MACRO stsw
sts (@0+1), @1L
sts @0, @1H
.endm
; Загрузка в стек регистровой пары (только для X, Y, Z)
.MACRO pushw
push @0H
push @0L
.endm
; Выгрузка из стека регистровой пары (только для X, Y, Z)
.MACRO popw
pop @0L
pop @0H
.endm