Вопрос по таймеру и не только.
Вопрос по таймеру и не только.
Всем МЯУ!
Есть несколько вопросов. Решил не плодить темы а все задать в одной. Уж не обессудте.
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 Ом , то на малом токе падение напряжения будет в диапазоне шумов. Как выйти из положения? Можно ли использовать автоматическое переключение релюхи между несколькими шунтами по уровню падения напряжения на шунте? Или есть другой способ?
Есть несколько вопросов. Решил не плодить темы а все задать в одной. Уж не обессудте.
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 Ом , то на малом токе падение напряжения будет в диапазоне шумов. Как выйти из положения? Можно ли использовать автоматическое переключение релюхи между несколькими шунтами по уровню падения напряжения на шунте? Или есть другой способ?
- Реклама
-
vAv
- Прорезались зубы
- Сообщения: 221
- Зарегистрирован: Пн июн 13, 2011 20:04:59
- Откуда: Новочебоксарск
- Контактная информация:
Re: Вопрос по таймеру и не только.
1. Перед тем как вывести, надо сначала погасить и сделать паузу. Видел где-то исходник, но на асме для пика
2. Не забыл присоединить заголовочный файл с типом контроллера?
3. что-то не так считаешь... на 0,1 ом упадет сколько вольт?
2. Не забыл присоединить заголовочный файл с типом контроллера?
3. что-то не так считаешь... на 0,1 ом упадет сколько вольт?
Re: Вопрос по таймеру и не только.
1. Зачем гасить и делать паузу? что это даст?
2. CV сам это делает. #include <mega8.h>
3. Блин. Точно. При расчете мощности взял входное напряжение. Лапух!
1 и 2 вопросы в силе.
2. CV сам это делает. #include <mega8.h>
3. Блин. Точно. При расчете мощности взял входное напряжение. Лапух!
1 и 2 вопросы в силе.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопрос по таймеру и не только.
лапух в квадрате: P = I*I*R = 10*10*0.1 = 10 Вт. первый раз было правильно.prw07 писал(а):3. Блин. Точно. При расчете мощности взял входное напряжение. Лапух!
битва с дураками проиграна, победители торжествуют. слава победителям!
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: Вопрос по таймеру и не только.
Вопрос 3 тоже в силе: при токе 10 А на 0.1 Ома упадет 1 В, что даст мощность 10 Вт. Многовато. Нужно ставить 0.01 Ома и использовать усилитель. Можно взять контроллер со встроенным усилителем (как, например, в ATmega64). А можно поставить внешний, например, LM358. Если хочется иметь два предела, то можно к шунту подключить два усилителя с разными Ку и подать с них сигнал на разные входы АЦП. Выбором входа будут переключаться пределы.
По вопросу 1: частота динамической индикации у Вас очень низкая. Я обычно ставлю 1 мс на разряд, моргания не видно. Что касается паузы между включением разрядов, то она имеет смысл лишь когда для управления общими электродами используются транзисторы с общим эмиттером. Они медленно закрывваются, может быть засветка лишних сегментов. Но даже при управлении прямо от портов я всё равно при динамической индикации сначало выключаю линии сканирования:
По вопросу 2: никогда не используйте номера битов, а только их имена! Нужно заставить компилятор их понимать, для чего необходимо подключить h-файл с определениями для данного процессора.
По вопросу 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;
}
}
- Реклама
Re: Вопрос по таймеру и не только.
лапух в квадрате
вот блин так блин. Лапух не просто в квадрате, а в квадратном квадрате. Ведь первый раз точно посчитал и 1В в расчетах брал, а не входное напряжение. Помню что десятка в расчетах была, а это ток был. Первый пост с толку сбил и запамятовал.при токе 10 А на 0.1 Ома упадет 1 В
И даже если усиливать входной сигнал, то будет усиливаться не только полезный сигнал, но и все что кабель и проводники поймают из "радиоэфира".
Это я понял. Поставил 6ms. Но всетаки почему глаз распознает мерцание? Ведь не должен. Сначала думал, что идет задержка на выполнения кода, но в протеусе смотрел, весь код динамики выполняется за пару десятков микросекунд.частота динамической индикации у Вас очень низкая. Я обычно ставлю 1 мс на разряд, моргания не видно.
ну так подключаю библиотеку же. Или еще какую-то нужно подключать?необходимо подключить h-файл с определениями для данного процессора.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопрос по таймеру и не только.
Вы забыли самое главное. Показать Ваш проект. У Вас может мерцать вовсе не из-за частоты, а , к примеру, из-за длительных пауз, отнимающих управление индикации. Вариантов много, а тут, к сожалению, телепатов нетНо всетаки почему глаз распознает мерцание?
Re: Вопрос по таймеру и не только.
Код: Выделить всё
#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)
{
};
}
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопрос по таймеру и не только.
Выложите весь проект вместе с проектом протеуса и .cof файлом. Всю папку короче.
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Re: Вопрос по таймеру и не только.
10 мс висите прерывании при чтении данных?
а зачем?
а зачем?
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопрос по таймеру и не только.
У него там вроде us, а не ms.Meteor писал(а):10 мс висите прерывании при чтении данных?![]()
а зачем?
А вот подобная конструкция
Код: Выделить всё
temperature=read_adc(0)*5/10.24; //данные АЦП датчикаВобщем нужен проект.
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: Вопрос по таймеру и не только.
Не беспокойтесь, не будет. Ведь источник сигнала очень низкоомный. Другое дело, разводку правильно сделать надо, чтобы падения на других проводниках на показания не сказывались.prw07 писал(а):И даже если усиливать входной сигнал, то будет усиливаться не только полезный сигнал, но и все что кабель и проводники поймают из "радиоэфира".
Re: Вопрос по таймеру и не только.
10 мс висите прерывании при чтении данных?
а зачем?
На получение данных от АЦП уходит до 15 тактов (согласно даташиту). Так что они не могут повлиять на индикацию. Кроме того попробовал вынести чтение данных АЦП отдельным прерыванием с частотой 1 раз в секунду (мне чаще не нужно). На индикацию это не повлияло.А вот подобная конструкция
Код:
temperature=read_adc(0)*5/10.24; //данные АЦП датчика
Будет выполняться очень долго.
Подскажите как сделать правильно?Другое дело, разводку правильно сделать надо, чтобы падения на других проводниках на показания не сказывались.
Вот весь проект.
- Вложения
-
- Общий катод.rar
- (66.41 КБ) 153 скачивания
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: Вопрос по таймеру и не только.
Ой, что это? Это проект в чём?prw07 писал(а):Вот весь проект.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопрос по таймеру и не только.
прерывание должно заниматься ТОЛЬКО динамической индикацией. кроме того, у вас крайне нерационально ведется вычисление того, что надо показать на индикаторе в данный момент индикации. рекомендую почитать статьи ARV по этой теме: тыц, тыц, тырырыц
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Вопрос по таймеру и не только.
CodeVision и Proteus. Вся папка как и просили.Ой, что это? Это проект в чём?
Ну а в чем сложность-то? Все ж как нужно.
Ничего не выйдет. Все равно шунты будут параллельно замкнуты. Нужно переключатель ставить. Либо тумблер либо токовое реле.Если хочется иметь два предела, то можно к шунту подключить два усилителя с разными Ку и подать с них сигнал на разные входы АЦП
Я уже писал, что перенес вычисления на другое прерывание (1 раз в секунду) и на индикации это не отразилось. Все-равно блымает. И даже если закоментировать вычисление тоже блымает. На вычисление уходит до 20 тактов, что не повлияет на индукацию.прерывание должно заниматься ТОЛЬКО динамической индикацией
Вы имеете ввиду, что вычисления производятся с частотой индикации? Но ведь это зависит от поставленной задачи.кроме того, у вас крайне нерационально ведется вычисление того, что надо показать на индикаторе в данный момент индикации.
Кстати ссылки не работают.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопрос по таймеру и не только.
повторяю: делать вычисления, да еще с плавающей точкой, в прерываниях (любых) - это дурной тон в программировании для МК. в вашем случае можно головой поручиться, что это ЛИШНЕЕ.prw07 писал(а):Я уже писал, что перенес вычисления на другое прерывание (1 раз в секунду) и на индикации это не отразилось. Все-равно блымает.
это проблема с вашим доступом - ссылки рабочие.prw07 писал(а):Кстати ссылки не работают.
битва с дураками проиграна, победители торжествуют. слава победителям!
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: Вопрос по таймеру и не только.
Ни того, ни другого у меня нет, поэтому я не знал, как выглядят их проекты.prw07 писал(а):CodeVision и Proteus. Вся папка как и просили.
Ну а в чем сложность-то? Все ж как нужно.
Почему не выйдет? К одному шунту подключаете два усилителя с разными коэффициентами усиления. И на разные входы АЦП.prw07 писал(а):Ничего не выйдет. Все равно шунты будут параллельно замкнуты. Нужно переключатель ставить. Либо тумблер либо токовое реле.
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Вопрос по таймеру и не только.
Ребята, о чем спор ?
Если включить лампу освещения через диод, мерцание будет заметно, а инерционность нити накаливания куда выше, чем светодиода.
Чувствительность периферийного зрения выше, поэтому мерцание сильнее заметно, когда смотреть чуть в сторону. мне сразу возразят, а как же кинематограф, с его 24 кадра в секунду.
Там скважность другая
Если включить лампу освещения через диод, мерцание будет заметно, а инерционность нити накаливания куда выше, чем светодиода.
Чувствительность периферийного зрения выше, поэтому мерцание сильнее заметно, когда смотреть чуть в сторону. мне сразу возразят, а как же кинематограф, с его 24 кадра в секунду.
Там скважность другая
-
vAv
- Прорезались зубы
- Сообщения: 221
- Зарегистрирован: Пн июн 13, 2011 20:04:59
- Откуда: Новочебоксарск
- Контактная информация:
Re: Вопрос по таймеру и не только.
По третьему вопросу то что не правильно считаешь имелось ввиду что считаешь не правильно про резистор 0,01 ома. 
При AREF = 2в (минимальное по даташиту, но может еще можно уменьшить и тогда пределы расширятся) и при падении 0,1 получаем что на одну единицу АЦП мы имеем 2/1024 = 0,001953125 вольта или 50 делений. На 10 ампер это 0,2 амера на деление. Т.е. ток ты выведешь с относительной погрешностью всего 0,2/2 = 0,1 ампера. Думаю что в принципе этого достаточно. Прикидки конечно грубые. Если не прав, то поправьте. Пока до измерения токов еще не добрался.
Кстати шунты в продаже по 75мв всего. Как то же мерят на них.
Кстати, насчет индикаторов - заказал себе парочку MAX7219, чтобы не заморачиваться с недостатком выводов для одной своей хреновины.
При AREF = 2в (минимальное по даташиту, но может еще можно уменьшить и тогда пределы расширятся) и при падении 0,1 получаем что на одну единицу АЦП мы имеем 2/1024 = 0,001953125 вольта или 50 делений. На 10 ампер это 0,2 амера на деление. Т.е. ток ты выведешь с относительной погрешностью всего 0,2/2 = 0,1 ампера. Думаю что в принципе этого достаточно. Прикидки конечно грубые. Если не прав, то поправьте. Пока до измерения токов еще не добрался.
Кстати шунты в продаже по 75мв всего. Как то же мерят на них.
Кстати, насчет индикаторов - заказал себе парочку MAX7219, чтобы не заморачиваться с недостатком выводов для одной своей хреновины.


