Страница 1 из 2
Вопрос по таймеру и не только.
Добавлено: Чт окт 20, 2011 08:47:48
prw07
Всем МЯУ!
Есть несколько вопросов. Решил не плодить темы а все задать в одной. Уж не обессудте.
1. При динамической индикации на 3-х секционный семисегментник вывожу информацию с частотой 75 Гц (25Гц х 3). И наблюдаю интенсивное моргание, которое пропадает, если поднять частоту до 150Гц, т.е. 50Гц на секцию. Почему? Ведь для глаза не должно быть уловимо мерцание в 25Гц.
2. Почему CodeVision на операцию "TCCR0=(1<<CS20)" выдает ошибку "неизвестная переменная CS20" ? Но если ставить номер бита, то все хорошо. В CV не предусмотрено обращение к регистрам через название их битов?
3. Хочу сделать амперметр с диапазоном измерения от 0.01А до 10А (шаг 0.01А). Я так понимаю, что один шунт в 0.1 Ом не пойдет (при напряжении 10В и токе 10А рассеиваемая мощность 10Вт, а значит нагрев шунта и изменение его сопротивления). Если ставить шунт 0.01 Ом , то на малом токе падение напряжения будет в диапазоне шумов. Как выйти из положения? Можно ли использовать автоматическое переключение релюхи между несколькими шунтами по уровню падения напряжения на шунте? Или есть другой способ?
Re: Вопрос по таймеру и не только.
Добавлено: Чт окт 20, 2011 08:55:51
vAv
1. Перед тем как вывести, надо сначала погасить и сделать паузу. Видел где-то исходник, но на асме для пика
2. Не забыл присоединить заголовочный файл с типом контроллера?
3. что-то не так считаешь... на 0,1 ом упадет сколько вольт?

Re: Вопрос по таймеру и не только.
Добавлено: Чт окт 20, 2011 10:51:31
prw07
1. Зачем гасить и делать паузу? что это даст?
2. CV сам это делает. #include <mega8.h>
3. Блин. Точно. При расчете мощности взял входное напряжение. Лапух!
1 и 2 вопросы в силе.
Re: Вопрос по таймеру и не только.
Добавлено: Чт окт 20, 2011 10:54:18
Мастер Ломастер
prw07 писал(а):3. Блин. Точно. При расчете мощности взял входное напряжение. Лапух!
лапух в квадрате:
P = I*I*R = 10*10*0.1 = 10 Вт. первый раз было правильно.
Re: Вопрос по таймеру и не только.
Добавлено: Чт окт 20, 2011 11:09:53
Леонид Иванович
Вопрос 3 тоже в силе: при токе 10 А на 0.1 Ома упадет 1 В, что даст мощность 10 Вт. Многовато. Нужно ставить 0.01 Ома и использовать усилитель. Можно взять контроллер со встроенным усилителем (как, например, в ATmega64). А можно поставить внешний, например, LM358. Если хочется иметь два предела, то можно к шунту подключить два усилителя с разными Ку и подать с них сигнал на разные входы АЦП. Выбором входа будут переключаться пределы.
По вопросу 1: частота динамической индикации у Вас очень низкая. Я обычно ставлю 1 мс на разряд, моргания не видно. Что касается паузы между включением разрядов, то она имеет смысл лишь когда для управления общими электродами используются транзисторы с общим эмиттером. Они медленно закрывваются, может быть засветка лишних сегментов. Но даже при управлении прямо от портов я всё равно при динамической индикации сначало выключаю линии сканирования:
Код: Выделить всё
//------------------------- Сканирование дисплея: ----------------------------
void Display_Exe(bool t)
{
static char Phase = 0;
if(t)
{
//выключение всех скан-линий:
Port_SCAN1_1;
Port_SCAN2_1;
Port_SCAN3_1;
char s = SegData[Phase];
//включение нужных сегментов:
(s & 0x01)? Port_SEG_A_1 : Port_SEG_A_0;
(s & 0x02)? Port_SEG_B_1 : Port_SEG_B_0;
(s & 0x04)? Port_SEG_C_1 : Port_SEG_C_0;
(s & 0x08)? Port_SEG_D_1 : Port_SEG_D_0;
(s & 0x10)? Port_SEG_E_1 : Port_SEG_E_0;
(s & 0x20)? Port_SEG_F_1 : Port_SEG_F_0;
(s & 0x40)? Port_SEG_G_1 : Port_SEG_G_0;
(s & 0x80)? Port_SEG_H_1 : Port_SEG_H_0;
//включение нужной скан-линии:
(Phase == 0)? Port_SCAN1_0 : Port_SCAN1_1;
(Phase == 1)? Port_SCAN2_0 : Port_SCAN2_1;
(Phase == 2)? Port_SCAN3_0 : Port_SCAN3_1;
//следующая фаза сканирования:
if(++Phase == DIGS) Phase = 0;
}
}
По вопросу 2: никогда не используйте номера битов, а только их имена! Нужно заставить компилятор их понимать, для чего необходимо подключить h-файл с определениями для данного процессора.
Re: Вопрос по таймеру и не только.
Добавлено: Чт окт 20, 2011 11:36:50
prw07
лапух в квадрате
при токе 10 А на 0.1 Ома упадет 1 В
вот блин так блин. Лапух не просто в квадрате, а в квадратном квадрате. Ведь первый раз точно посчитал и 1В в расчетах брал, а не входное напряжение. Помню что десятка в расчетах была, а это ток был. Первый пост с толку сбил и запамятовал.
И даже если усиливать входной сигнал, то будет усиливаться не только полезный сигнал, но и все что кабель и проводники поймают из "радиоэфира".
частота динамической индикации у Вас очень низкая. Я обычно ставлю 1 мс на разряд, моргания не видно.
Это я понял. Поставил 6ms. Но всетаки почему глаз распознает мерцание? Ведь не должен. Сначала думал, что идет задержка на выполнения кода, но в протеусе смотрел, весь код динамики выполняется за пару десятков микросекунд.
необходимо подключить h-файл с определениями для данного процессора.
ну так подключаю библиотеку же. Или еще какую-то нужно подключать?
Re: Вопрос по таймеру и не только.
Добавлено: Чт окт 20, 2011 16:48:57
Аlex
Но всетаки почему глаз распознает мерцание?
Вы забыли самое главное. Показать Ваш проект. У Вас может мерцать вовсе не из-за частоты, а , к примеру, из-за длительных пауз, отнимающих управление индикации. Вариантов много, а тут, к сожалению, телепатов нет

Re: Вопрос по таймеру и не только.
Добавлено: Чт окт 20, 2011 17:27:03
prw07
Код: Выделить всё
#include <mega8.h>
#include <math.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00
volatile unsigned int a, temperature;
unsigned char x=1;
const unsigned char codes[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
temperature=read_adc(0)*5/10.24; //данные АЦП датчика
switch (x) //по очереди зажигаем каждый индикатор (за одно прерывание - один индикатор).
{ //Переменная "х" определяет порядковый номер индикатора который засвечивается
case 1:{
PORTD=0b11111110; //включаем первый индикатор
PORTB=codes[temperature/100]; //выводим первый символ
x=0x02;
a=temperature/100; //получаем второй символ
a=temperature-a*100;
break;
};
case 2:{
PORTD=0b11111101; //включаем второй индикатор
PORTB=codes[a/10]; //выводим второй символ
x=0x03;
a=temperature/10; //получаем третий символ
a=temperature-a*10;
break;
};
case 3:{
PORTD=0b11111011; //включаем третий индикатор
PORTB=codes[a]; //выводим третий символ
x=0x01;
break;
};
}
}
// Declare your global variables here
void main(void)
{
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x0d;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x68;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x10;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x86;
// Global enable interrupts
#asm("sei")
while (1)
{
};
}
Re: Вопрос по таймеру и не только.
Добавлено: Чт окт 20, 2011 18:00:22
Аlex
Выложите весь проект вместе с проектом протеуса и .cof файлом. Всю папку короче.
Re: Вопрос по таймеру и не только.
Добавлено: Чт окт 20, 2011 18:01:42
Meteor
10 мс висите прерывании при чтении данных?
а зачем?
Re: Вопрос по таймеру и не только.
Добавлено: Чт окт 20, 2011 18:03:20
Аlex
Meteor писал(а):10 мс висите прерывании при чтении данных?
а зачем?
У него там вроде
us, а не
ms.

А вот подобная конструкция
Код: Выделить всё
temperature=read_adc(0)*5/10.24; //данные АЦП датчика
Будет выполняться очень долго.
Вобщем нужен проект.
Re: Вопрос по таймеру и не только.
Добавлено: Чт окт 20, 2011 19:45:03
Леонид Иванович
prw07 писал(а):И даже если усиливать входной сигнал, то будет усиливаться не только полезный сигнал, но и все что кабель и проводники поймают из "радиоэфира".
Не беспокойтесь, не будет. Ведь источник сигнала очень низкоомный. Другое дело, разводку правильно сделать надо, чтобы падения на других проводниках на показания не сказывались.
Re: Вопрос по таймеру и не только.
Добавлено: Чт окт 20, 2011 20:28:29
prw07
10 мс висите прерывании при чтении данных?

а зачем?
А вот подобная конструкция
Код:
temperature=read_adc(0)*5/10.24; //данные АЦП датчика
Будет выполняться очень долго.
На получение данных от АЦП уходит до 15 тактов (согласно даташиту). Так что они не могут повлиять на индикацию. Кроме того попробовал вынести чтение данных АЦП отдельным прерыванием с частотой 1 раз в секунду (мне чаще не нужно). На индикацию это не повлияло.
Другое дело, разводку правильно сделать надо, чтобы падения на других проводниках на показания не сказывались.
Подскажите как сделать правильно?
Вот весь проект.
Re: Вопрос по таймеру и не только.
Добавлено: Чт окт 20, 2011 21:36:20
Леонид Иванович
prw07 писал(а):Вот весь проект.
Ой, что это? Это проект в чём?
Re: Вопрос по таймеру и не только.
Добавлено: Пт окт 21, 2011 08:32:27
Мастер Ломастер
прерывание должно заниматься ТОЛЬКО динамической индикацией. кроме того, у вас крайне нерационально ведется вычисление того, что надо показать на индикаторе в данный момент индикации. рекомендую почитать статьи ARV по этой теме:
тыц,
тыц,
тырырыц
Re: Вопрос по таймеру и не только.
Добавлено: Пт окт 21, 2011 08:41:38
prw07
Ой, что это? Это проект в чём?
CodeVision и Proteus. Вся папка как и просили.
Ну а в чем сложность-то? Все ж как нужно.
Если хочется иметь два предела, то можно к шунту подключить два усилителя с разными Ку и подать с них сигнал на разные входы АЦП
Ничего не выйдет. Все равно шунты будут параллельно замкнуты. Нужно переключатель ставить. Либо тумблер либо токовое реле.
прерывание должно заниматься ТОЛЬКО динамической индикацией
Я уже писал, что перенес вычисления на другое прерывание (1 раз в секунду) и на индикации это не отразилось. Все-равно блымает. И даже если закоментировать вычисление тоже блымает. На вычисление уходит до 20 тактов, что не повлияет на индукацию.
кроме того, у вас крайне нерационально ведется вычисление того, что надо показать на индикаторе в данный момент индикации.
Вы имеете ввиду, что вычисления производятся с частотой индикации? Но ведь это зависит от поставленной задачи.
Кстати ссылки не работают.
Re: Вопрос по таймеру и не только.
Добавлено: Пт окт 21, 2011 08:59:11
Мастер Ломастер
prw07 писал(а):Я уже писал, что перенес вычисления на другое прерывание (1 раз в секунду) и на индикации это не отразилось. Все-равно блымает.
повторяю: делать вычисления, да еще с плавающей точкой, в прерываниях (любых) - это дурной тон в программировании для МК. в вашем случае можно головой поручиться, что это ЛИШНЕЕ.
prw07 писал(а):Кстати ссылки не работают.
это проблема с вашим доступом - ссылки рабочие.
Re: Вопрос по таймеру и не только.
Добавлено: Пт окт 21, 2011 09:06:38
Леонид Иванович
prw07 писал(а):CodeVision и Proteus. Вся папка как и просили.
Ну а в чем сложность-то? Все ж как нужно.
Ни того, ни другого у меня нет, поэтому я не знал, как выглядят их проекты.
prw07 писал(а):Ничего не выйдет. Все равно шунты будут параллельно замкнуты. Нужно переключатель ставить. Либо тумблер либо токовое реле.
Почему не выйдет? К одному шунту подключаете два усилителя с разными коэффициентами усиления. И на разные входы АЦП.
Re: Вопрос по таймеру и не только.
Добавлено: Пт окт 21, 2011 09:38:57
urry
Ребята, о чем спор ?
Если включить лампу освещения через диод, мерцание будет заметно, а инерционность нити накаливания куда выше, чем светодиода.
Чувствительность периферийного зрения выше, поэтому мерцание сильнее заметно, когда смотреть чуть в сторону. мне сразу возразят, а как же кинематограф, с его 24 кадра в секунду.
Там скважность другая

Re: Вопрос по таймеру и не только.
Добавлено: Пт окт 21, 2011 11:21:25
vAv
По третьему вопросу то что не правильно считаешь имелось ввиду что считаешь не правильно про резистор 0,01 ома.

При AREF = 2в (минимальное по даташиту, но может еще можно уменьшить и тогда пределы расширятся) и при падении 0,1 получаем что на одну единицу АЦП мы имеем 2/1024 = 0,001953125 вольта или 50 делений. На 10 ампер это 0,2 амера на деление. Т.е. ток ты выведешь с относительной погрешностью всего 0,2/2 = 0,1 ампера. Думаю что в принципе этого достаточно. Прикидки конечно грубые. Если не прав, то поправьте. Пока до измерения токов еще не добрался.
Кстати шунты в продаже по 75мв всего. Как то же мерят на них.
Кстати, насчет индикаторов - заказал себе парочку MAX7219, чтобы не заморачиваться с недостатком выводов для одной своей хреновины.
