Помогите разобраться с программой

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

Спасибо ARV, я действительно считываю оба регистра, но использую только один...
И еще кажется я поняла в чем причина того, что при числе ВВ срабатывает при 3,8В входного, тогда как ВВ это число для 3В. Тот сигнал который я смотрю осциллографом имеет размах 3,8В, но 0,7В опущены относительно земли т.е. это кусочек отрицательной полуволны и АЦП ее не видит и не учитывает при преобразовании... Пока я только так могу объяснить то что у меня происходит...
Теперь вопрос каким образом частота входного сигнала влияет на напряжение включения и выключения? Может есть метод как это узнать?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

показания тестера при наличии "невидимой" для АЦП части кривой напряжения будут как бы завышенными. Однако, как я говорил, АЦП работает с мгновенными уровнями и соотносить их с показаниями тестера как-то нелогично.

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

Мой уютный бложик... заходите!
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Сообщение MetEl »

Ничего резкого не заметил.
Непонял в чём я ошибаюсь.
Это не уменьшение разрядности.
Это разрез слова и изменение его информации, искажение.
Т.к. необходимо после того как считал из ADCH сдвинуть его на 2 разряда влево.
Чтоб не получилось ошибки.
А в бошку вбивается 8бит.
А АЦП получает результат в 10бит.
Ёжик делит на 255, но АЦП то на 1023.
Это что?!
простое чмо, выдумщик
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

MetEl, уменьшение разрядности всегда делается путем отбрасывания младших ненужных битов. отбрасывание - это сдвиг. т.е. отбросив 1 бит мы получаем не 10 разрядный результат АЦП, а 9-разрядный.

если достаточно 8 бит результата, то можно получить обычное знаячение из пары регисторв ADCH:ADCL (т.е. 16 бит, из которых только 10 что-то означают) и сдвинуть результат на 2 разряда вправо, т.е. поделить на 4. в итоге мы получим те же 16 бит, из которых уже только 8 несут полезную информацию.

но если нам не требуется число int, а достаточно числа char - нам еще придется и преобразовать тип результата - в итоге довольно много операций для получения 8-битного результата.

тот же самый результат можно сделать иначе: запустить АЦП в режиме "выравнивания влево" - в этом случае ADCH будет содержать старшие 8 бит результата, а ADCL - ненужные нам 2 бита. Остается только взять значение ADCH в качестве char и работать с ним. согласитесь, что это гораздо менее трудоемко.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Сообщение MetEl »

Допустим.
Но их надо сдвинуть в лево!
Чтобы появился первый и второй бит.
А то на место первого записывается значение третьего.
Я там где то писал.
unsigned int a;//если надо не потерять значения 9 и 8 бита. иначе unsigned char
Вот регистры ADCH ; ADCL
Вот результат 98765432;10xxxxxx
a=ADCH;
Биты результата АЦП расположатся вот так -
98765432
a<<=2;
Вот как теперь встанет результат АЦП -
7654321хх;


Вот в числах, для примера результат АЦП = 255:
ADCH ; ADCL
00111111;11xxxxxx
a=ADCH; // a=63 ошибка!
a<<=2; // а=252 то что вы называетсе не нужной точностью. +/-3

Мне удалось показать, то что я хотел показать?
Последний раз редактировалось MetEl Чт июн 26, 2008 10:18:36, всего редактировалось 2 раза.
простое чмо, выдумщик
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

вам удалось показать, что вы не в ладах с математикой :)

смотрите сами: вы намерили 255, т.е. 1/4 всего диапазона, так? для 10 бит и для 8 бит четверть диапазона всегда остается четвертью. значит, если просто отбросить 2 бита (т.е. перейти к 8 битам), мы получим 63: смотрите: вся шакала 255, а 63 - это как раз ее четверть! а если сделать то, что предлагаете вы - у вас сразу вместо четверти получится почти 100% шкалы!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Сообщение MetEl »

Я исхожу из того, что пишет Ёжик.
А не из того, что знаете или как понимаете вы или я.
Цитирую:
"напряжение 4,09В, для 8 разрядного ацп это 0,016 В на разряд? т.е. для 3 В это будет 3/0.016=ВВ? Но у меня срабатывание от этого значения не происходит, а происходит от значения 0х47h т.е. 71*0.016=1,15В,"

Написано - для 8-ми разрядного АЦП. Но не написано, что условно (за не надобностью такой точности) будет считаться(она будет учитывать) только 8бит(старших) из 10-ти.
Можно сказать псевдо режим, 8-и битный.


Допустим, если представить что 10-ть бит это псевдо 8-мь бит.
И работать с коэффициентом 4-ре.
Тогда 4/1023=0,004 или 4/255=0,016/4
Значит для срабатывания условия при 3В(скажем) то значение результата АЦП будет 3/0,004=750 или 3/0,016=187(в регистре adcH)*4=750
Т.е если работать только с регистром adcH то надо, либо помножить его значение на 4-е, ли вести расщёт пересщитанными значениями(по коэф. 4-ре)
в слове АЦП___________В adcH
Т.к. 3В =750 (0x2EE) / 4 = 187 (0xBB)

Далее, Ёжик пишет -
-Да, правильно я эти 2 бита теряю...
в Вашей ссылке, к стати спасибо за нее огромное, написано в самом конце:
"Левосторонний формат представления результата удобно использовать, если достаточно 8 разрядов. В этом случае 8-разрядный результат хранится в регистре ADCH и, следовательно, чтение регистра ADCL можно не выполнять. "

Как читать восьмиразрядный результат?!
Восемь бит из 10-ти разрядного результата преобразования, вот как!
Вот я и пытался выяснить, как вы считаете то, непонятно, както.
простое чмо, выдумщик
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

Мой уютный бложик... заходите!
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Сообщение MetEl »

ладно
простое чмо, выдумщик
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

ARV писал(а):что-то я плохо понимаю суть поведения вашего девайса... вы говорите о полуволнах, но тут же всплывают какие-то корелляции с показаниями тестера...

показания тестера при наличии "невидимой" для АЦП части кривой напряжения будут как бы завышенными. Однако, как я говорил, АЦП работает с мгновенными уровнями и соотносить их с показаниями тестера как-то нелогично.

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


Да я поняла, что Вы имеете в виду и действительно показания тестера здесь не совсем уместны... Мое устройство должно срабатывать на средний уровень или действующее напряжение или как это еще назвать не знаю... т.е. на уровень равный 3В по показаниям обычного тестера... Эти 3В - это напряжение на выходе генератора =входе устройства... при этом , на ацп приходит сигнал совсем другого уровня и измеряет оно как Вы говорили мгновенное значение напряжения... в общем то я уже близка к цели... уже поняла какое значение напряжения измеряет ацп и даже уже происходит србатывание от нужного уровня...
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

У меня теперь вопрос по фильтру...
чем будут отличаться в выполнеии 2 записи?


Почему код криво вставляется...?
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

Вставляю код как картинку:
Изображение


ну или если не трудно, посмотрите здесь:
http://content.foto.mail.ru/list/nd/204/i-205.jpg

чем будут отличаться в выполнении эти 2 записи?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

Мой уютный бложик... заходите!
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

Теоретически мне нужно сделать следующее:
ацп измеряет одну полуволну синусоиды и сохраняет значения в массиве adc_buffer[i], далее мне нужно брать 2 соседних отсчета складывать их и делить на 2 и так по всей синусоиде.... эти средние значения я помещаю в массив result[i].... далее нужно определить начало и конец полуволны - для этого задаю порог - если значение result[i] больше порога, то мы это помещаем снова в adc_buffer[i]
далее в программе анализ уже ищем максимальное значение из adc_buffer[i] и сравниваем с числом в епроме....
фильтр должен сглаживать входной сигнал и находить начало и конец полуволны в отсчетах... Примерно так...
вопрос собственно в том, что если я записываю в контроллер первый вариант фильтра- все работает, во втором случае не работает... в вар.1. я в result[i] помещаю пересчитанные 64 отсчета а вот оператор иф берет каждый отсчет или только первый или последний? Нужно ли это иф делать в цикле?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

хоть убейте - не понимаю, что ваш девайс все-таки должен делать?

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

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

Мой уютный бложик... заходите!
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

Отвечаю, что делает устройство:
это устройство анализирует входной сигнал (синусоиду) двумя каналами обработки. При совпадении сигналов каждого из каналов происходит включение выходных ключей.
Что делают контроллеры:
на входы ацп двух контроллеров приходит входной сигнал - выпрямленное переменное напряжение, если это напряжение превышает пороговый уровень (порог задается в епроме) , то контроллер на одной из ножек выдает логическую единицу.

хотела бы всетаки Вас попросить помочь мне понять как работает цикл в http://content.foto.mail.ru/list/nd/204/i-205.jpg ссылке...
в вар.1 программы оператор иф какое значение i бкудет подставлять от 3до ADC_STOPSTEP, или только одно какое то конкретное число i возьмет ?

я хочу Вам сказать огромное спасибо, что вы не бросили это занятие - помогать мне разобраться в моей программе... Ваша помощь мне очень помогла :)
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

Ну может кто нибудь мне подскажет как работает оператор for...
мне нужно в цикле от и=0 до и=10 в массив Б поместить значения массива А. далее с помощью иф проверить каждое значение массива Б. если и-тое значение массива Б больше С, тогда помещаем в массив А только те значения массива Б, которые больше С. Как это правильно написать? Нужно ли 2 цикла или просто написать фор (и=0; и меньше 10 ; и ++) а далее все манипуляции поместить в фигурные скобки?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

поясните: из массива А вы копируете в массив Б сначала все значения, а потом некоторые из Б в А. вопрос: в чем смысл таких манипуляций? ведь все элементы, которые можно найти в Б по определению уже есть в А!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

Я в массив Б помещаю такие значения массива А: ( А[i]+A[i+1])/2. а потом из Б выбираю нужные и снова их помещаю в А. Это можно сделать в одном циле или нужно 2?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

можно и в одном. нашли среднее для а(и) и а(и+1), занесли его в б(и), сравнили с К и, если надо, сразу занесли в а(и). потом и++ и следующая итерация цикла.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»