Например TDA7294

Форум РадиоКот • Просмотр темы - Вывод значений с подстановкой из массива.
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс авг 03, 2025 18:44:09

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 23 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Ср июн 15, 2016 14:52:00 
Вымогатель припоя

Карма: 8
Рейтинг сообщений: -1
Зарегистрирован: Пт ноя 08, 2013 01:01:18
Сообщений: 579
Рейтинг сообщения: 0
Добрый день! Подскажите как можно красиво на Си сделать такую задачу. Есть симисторный регулятор на ATtiny2313. Обороты регулируются с помощью таймера/счетчика 1 в режиме СТС. Максимальной скорости соответсвует значение равное 9600, минимальной скорости - 1824. Всего есть 28 градаций скорости. В процентах оборотов это от 19 % до 100 %. Сам двигатель работает на оборотах от 8000 об/мин до 35000 об/мин. На регуляторе есть двухразрядный семисегментный индикатор. На нем отображаются обороты в тысячах оборотов в минуту. Задача стоит такая, не используя switch case , при значении 9600 отображать обороты 35, при значении 1824 обороты отображать 08. Вот массивы используемые:
обороты в процентах:
speed[27] = {19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100};
обороты в значении регистра сравнения:
{1824,2112,2400,2688,2976,3264,3552,3840,4128,4416,4704,4992,5280,5568,5856,6144,6432,6720,7008,7296,7584,7872,8160,8448,8736,9024,9312,9600};
обороты отображаемые на экране:
{8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35}
ЗЫ: А то кроме switch ничего в голову не лезет.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Ср июн 15, 2016 15:09:13 
Друг Кота

Карма: 49
Рейтинг сообщений: 544
Зарегистрирован: Чт фев 20, 2014 18:57:55
Сообщений: 19488
Рейтинг сообщения: 0
Почему бы вам просто индекс текущего режима (градации) не использовать и по нему доставать из массивов остальные значения ?

_________________
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Ср июн 15, 2016 15:21:44 
Вымогатель припоя

Карма: 8
Рейтинг сообщений: -1
Зарегистрирован: Пт ноя 08, 2013 01:01:18
Сообщений: 579
Рейтинг сообщения: 0
Если бы значение таймера было в массиве , а у меня реализовано через прибавление/вычитание дельты с граничным ограничением
Спойлер#define control_triac PD1 //Вывод на управляющий электрод симистора
#define v_change_speed 288 //Шаг регулировки изменения скорости
#define t_pulse_triac 50 //Длительность отпирающего импульса симистора 30 мкс (смотреть по ТУ для конкретного симистора)
#define SP_hi 9600 // максимальная скорость
#define SP_lo 1824 // минимальная скорость
#define SP_m 4992 // средняя скорость

/********************* Обработчик прерывания по переполнению Timer 0 ***************
ISR(TIMER0_OVF_vect)
{
// Перезагрузка значения для Timer 0
// Период Timer0 = 0.125 МГц = 8 МГц / 64.
// 2 мс = 8 мкс * 250
// 5 = 255-250
TCNT0 = 5;
state_counter++;
output_change = 1; // Это флаг для цикла main
if (state_counter > 3)
state_counter = 0;

if(bit_is_clear(PIND, Sw1)) //если нажата кнопка +
{

speed += v_change_speed; //увеличиваем скорость с заданным шагом
if(speed > SP_hi) speed = SP_hi;//не выходя за пределы
}
else if(bit_is_clear(PIND, Sw2)) //если нажата кнопка -
{

speed -= v_change_speed; //уменьшаем скорость заданным шагом
if(speed <= SP_lo) speed = SP_lo;//не выходя за пределы
}
}

//********************* Обработчик внешнего прерывания 0 *****************************
ISR (INT0_vect) //По переднему/заднему фронтам импульса ZERO-CROSS
{
OCR1A = 10000 - speed; //Регистру сравнения присваиваем значение скорости
TCCR1B |= _BV(WGM12) | _BV(CS10); //Запускаем таймер 1 в режиме СТС с периодом счёта 1 мкс
}

//********************* Обработчик прерывания по сравнению Timer 1 *******************
ISR (TIMER1_COMPA_vect) //прерывание для формирования открывающего импульса симистора
{
PORTD &= ~_BV(control_triac); //Передний фронт отпирающего импульса симистора
_delay_us (t_pulse_triac); //Длительность отпирающего импульса
PORTD |= _BV(control_triac); //Задний фронт отпирающего импульса симистора
TCCR1B = TCNT1 = 0; //остановка и обнуление таймера 0
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Ср июн 15, 2016 17:34:54 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
И что же мешает в таймере обратится к этим массивам для регистра сравнения и отображения на экране?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Ср июн 15, 2016 17:46:09 
Электрический кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 129
Зарегистрирован: Чт июн 20, 2013 00:00:58
Сообщений: 1031
Откуда: москва, м.Сходненская
Рейтинг сообщения: 0
религия :))) особо не вникал, но зачем прибавлять шаги когда можно доставать из массива? только 28 и 27 в массиве не понял почему...
/////
Код:
speed_v [28] = {1824,2112,2400,2688,2976,3264,3552,3840,4128,4416,4704,4992,5280,5568,5856,6144,6432,6720,7008,7296,7584,7872,8160,8448,8736,9024,9312,9600};
indikator [27] = {8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35};
/////
speed = speed_v[i++]; //увеличиваем скорость с заданным шагом
speed = speed_v[i--]; ////уменьшаем скорость заданным шагом
/////
temp = indikator[i]; //вывод на индикацию оборотов....


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Ср июн 15, 2016 19:58:40 
Потрогал лапой паяльник
Аватар пользователя

Карма: 11
Рейтинг сообщений: 53
Зарегистрирован: Вс янв 31, 2016 18:04:39
Сообщений: 383
Откуда: Montreal
Рейтинг сообщения: 0
Изображение
Гы, она же линейная, нaфига там массивы. В школе учили как решать систему из 2-х уравнений для нахождения Y = a * X + b?
Я как то ардуино научил решать полином 3-го порядка, это когда сильно нелинейная зависимость и кубическое уравнение.
Щёлкает как орехи, Y = a* X^3 + b* X^2 + c* X + d;, коэфициенты все пишет и глазом моргнуть не успеваю.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Ср июн 15, 2016 20:28:13 
Вымогатель припоя

Карма: 8
Рейтинг сообщений: -1
Зарегистрирован: Пт ноя 08, 2013 01:01:18
Сообщений: 579
Рейтинг сообщения: 0
Mishany писал(а):
только 28 и 27 в массиве не понял почему...

Очепятка. Там 28 значений скорости. Уравнением не получится, мне нужно целочисленные вычисления. Либо все в массивы загонять, либо через switch case присваивать значения. Как по мне что первый вариант, что второй не очень красивы, тем более с 2кб памяти хочется сделать компактно. Между оборотами в процентах и значением таймера/счетчика 1 есть прямая зависимость равна 96. Просто как потом от процентов перейти к индикации оборотов в тысячах оборотов в минуту. Потому здесь и спросил, какие могут быть варианты. Так как конструкция switch case не слишком нравится на 28 значений.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Ср июн 15, 2016 20:34:42 
Это не хвост, это антенна
Аватар пользователя

Карма: 20
Рейтинг сообщений: 188
Зарегистрирован: Вс мар 28, 2010 12:52:22
Сообщений: 1368
Откуда: Беларусь
Рейтинг сообщения: 0
На tiny13 написан "линеаризатор" для логометра в авто после замены датчика. Из тока 4-20 мА делал ток в 63-270 мА с обратной кубической зависимостью при помощи целочисленной математики. На ассемблере размер кода составил около 600-т байт. Пробуйте, на самом деле здесь (в математическом методе) гораздо больше гибкости - завтра может понадобится продлить Вашу кривую, а памяти уже и нет...

_________________
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Ср июн 15, 2016 20:46:33 
Потрогал лапой паяльник
Аватар пользователя

Карма: 11
Рейтинг сообщений: 53
Зарегистрирован: Вс янв 31, 2016 18:04:39
Сообщений: 383
Откуда: Montreal
Рейтинг сообщения: 0
melandr писал(а):
Уравнением не получится, мне нужно целочисленные вычисления.

Это вы о чём? Уравнение даёт величину, которую можно округлять вниз, вверх или по середине. Тип переменных в самом уравнении определяется требуемой точностью, флоты даблы или интегеры. Хотя забудьте, это слишком сложно для 3-го класса средней школы


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Ср июн 15, 2016 20:49:46 
Потрогал лапой паяльник
Аватар пользователя

Карма: 11
Рейтинг сообщений: 53
Зарегистрирован: Вс янв 31, 2016 18:04:39
Сообщений: 383
Откуда: Montreal
Рейтинг сообщения: 0
dr.doc писал(а):
На tiny13 написан "линеаризатор" для логометра в авто после замены датчика. Из тока 4-20 мА делал ток в 63-270 мА с обратной кубической зависимостью при помощи целочисленной математики.

Каким методом, если не секрет?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Ср июн 15, 2016 21:00:27 
Это не хвост, это антенна
Аватар пользователя

Карма: 20
Рейтинг сообщений: 188
Зарегистрирован: Вс мар 28, 2010 12:52:22
Сообщений: 1368
Откуда: Беларусь
Рейтинг сообщения: 0
4 мА вычитаются ОУ, давая нулевое значение, дальше что-то около "Ax^0.5+Bx^0.25+Cx". На выходе ШИМ, после RC фильтра второй ОУ в качестве источника тока вместе с полевиком. Для питания ОУ использован программный ШИМ с инверсией напряжения - дает около -3 вольт для отрицательного питания. Как показала практика - достаточно для LM358 и получения выходного напряжения от 0.
Формулу точно не скажу, проект на работе. Линеаризация получилась довольно приличная, хозяин конечного устройства доволен.


Вложения:
Пример.gif [146.13 KiB]
Скачиваний: 424

_________________
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Чт июн 16, 2016 00:15:18 
Потрогал лапой паяльник
Аватар пользователя

Карма: 11
Рейтинг сообщений: 53
Зарегистрирован: Вс янв 31, 2016 18:04:39
Сообщений: 383
Откуда: Montreal
Рейтинг сообщения: 0
Я так понимаю формулу вручную подбирали, некоторые ещё Эксель используют. Т.е. не численные методы. Я в ардуино метод наименьших квадратов приспособил, т.е. АтМега328 мне формулу сама выдаёт на массив исходных данных. Как здесь, например, один массив Х{} другой Y{}, но тут легко - линия, самое простое уравнение какое может быть.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Чт июн 16, 2016 12:00:48 
Вымогатель припоя

Карма: 8
Рейтинг сообщений: -1
Зарегистрирован: Пт ноя 08, 2013 01:01:18
Сообщений: 579
Рейтинг сообщения: 0
Ну мне нравится форум на коте. Одна вода. Был задан конкретный вопрос. Зачем мне решение МНК если у меня всего 28 значений, каждому соответствует определенное значение скорости. И промежуточные значения не нужны. Максимум, что может потребоваться, это изменить значение таймера/счетчика 1, если оно не будет соответствовать нужной скорости. Зачем мне решать систему линейных уравнений?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Чт июн 16, 2016 12:58:02 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
melandr писал(а):
Одна вода. Был задан конкретный вопрос.
вам были даны конкретные ответы:
Mishany писал(а):
зачем прибавлять шаги когда можно доставать из массива?
Morroc писал(а):
Почему бы вам просто индекс текущего режима (градации) не использовать и по нему доставать из массивов остальные значения ?
если этого не достаточно - конкретизируйте, чего еще не хватает.

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

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Чт июн 16, 2016 14:21:54 
Вымогатель припоя

Карма: 8
Рейтинг сообщений: -1
Зарегистрирован: Пт ноя 08, 2013 01:01:18
Сообщений: 579
Рейтинг сообщения: 0
То есть самым компактным и быстрым способом будет задавать значения таймера/счетчика 1 в виде матрицы, вот так , например:
const unsigned int speed_count[28] = {1824,2112,2400,2688,2976,3264,3552,3840,4128,4416,4704,4992,5280,5568,5856,6144,6432,6720,7008,7296,7584,7872,8160,8448,8736,9024,9312,9600};
Создать массив соответствующих скоростей для вывода на дисплей, вот так:
const unsigned char speed_lcd[28] = {8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35};
И при изменении скорости изменять индекс массива для текущей скорости, а не само значение таймера/счетчика 1. И соответственно по индексу массива выводить значение скорости на ЖКИ.
ЗЫ: А еще лучше сохранить эти массивы во флеш и обращаться к ним через pgm_read_word. И ничего лучше пока еще для решения такой задачи не придумали?
ЗЫ1: просто пару человек советует использовать массивы. А третий особо умный, зачем массивы, лучше систему уравнений. Вот потому и непонятно. Если бы контроллер был ATmega8 я бы не парился. А так как ATtiny2313 то хочется все поместить в нее.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Чт июн 16, 2016 15:17:35 
Потрогал лапой паяльник
Аватар пользователя

Карма: 11
Рейтинг сообщений: 53
Зарегистрирован: Вс янв 31, 2016 18:04:39
Сообщений: 383
Откуда: Montreal
Рейтинг сообщения: 0
Насчет системы уравнений это я лишнее, на Экселе графически просто решается.
Ваша CTC енто переменная, тогда
speed = CTC /96
lcd = (CTC +480) * 27 / 7776.

И всё. Массивы или Look-Up-Table (LUT) нужны когда нелинейная зависимость, и решить не получается или лень.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Чт июн 16, 2016 16:12:01 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
так что ли надо (тестировал на ПК):
Спойлер
Код:
unsigned int speed_v [28] = {1824, 2112, 2400, 2688, 2976, 3264, 3552, 3840, 4128, 4416, 4704, 4992, 5280, 5568, 5856, 6144, 6432, 6720, 7008, 7296, 7584, 7872, 8160, 8448, 8736, 9024, 9312, 9600};
unsigned char indikator [28] = {8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35};

unsigned char GetTable(unsigned int data)
{
    unsigned char n = 0;
    while(1)
    {
        if(data == speed_v[n])
        {
            return indikator[n];
        }
        else
        {
            n++;
            if(n >= 28) return 0;
        }
    }
}


int main(void)
{
    unsigned int k;
    unsigned char d;
    for(k = 1824; k <= 9600; k++)
    {
        d = GetTable(k);
        if(d != 0)
        {
            printf("Speed= %i", k);
            printf(" Indikator= %i\n", d);
        }
    }
    return 0;
}

результат:
Спойлер
Цитата:
Speed= 1824 Indikator= 8
Speed= 2112 Indikator= 9
Speed= 2400 Indikator= 10
Speed= 2688 Indikator= 11
Speed= 2976 Indikator= 12
Speed= 3264 Indikator= 13
Speed= 3552 Indikator= 14
Speed= 3840 Indikator= 15
Speed= 4128 Indikator= 16
Speed= 4416 Indikator= 17
Speed= 4704 Indikator= 18
Speed= 4992 Indikator= 19
Speed= 5280 Indikator= 20
Speed= 5568 Indikator= 21
Speed= 5856 Indikator= 22
Speed= 6144 Indikator= 23
Speed= 6432 Indikator= 24
Speed= 6720 Indikator= 25
Speed= 7008 Indikator= 26
Speed= 7296 Indikator= 27
Speed= 7584 Indikator= 28
Speed= 7872 Indikator= 29
Speed= 8160 Indikator= 30
Speed= 8448 Indikator= 31
Speed= 8736 Indikator= 32
Speed= 9024 Indikator= 33
Speed= 9312 Indikator= 34
Speed= 9600 Indikator= 35


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Чт июн 16, 2016 20:09:54 
Вымогатель припоя

Карма: 8
Рейтинг сообщений: -1
Зарегистрирован: Пт ноя 08, 2013 01:01:18
Сообщений: 579
Рейтинг сообщения: 0
MagicianT, спасибо это именно то что я искал. Просто не знал как это можно реализовать. А не подскажете как подбирается это числа, чтобы получить целый результат?
oleg110592, ну матричный способ мне кажется будет более затратный по размеру кода, по сравнению с одной формулой. Но тоже спасибо за помощь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Чт июн 16, 2016 20:28:39 
Потрогал лапой паяльник
Аватар пользователя

Карма: 11
Рейтинг сообщений: 53
Зарегистрирован: Вс янв 31, 2016 18:04:39
Сообщений: 383
Откуда: Montreal
Рейтинг сообщения: 0
Какие числа? Результат определяется типом перемменых lcd и speed. Т.е. если lcd декларирована как int / uint8_t / uint16_t, то будет округление вниз. Если поточнее округлить надо, скажем 1.4 -> до 1, а 1.6 -> до 2, то там перед делением прибавьте половину делителя
speed = ( CTC + 48 ) /96
lcd = ((CTC +480) * 27 + 3888) / 7776.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вывод значений с подстановкой из массива.
СообщениеДобавлено: Чт июн 16, 2016 21:46:10 
Друг Кота

Карма: 49
Рейтинг сообщений: 544
Зарегистрирован: Чт фев 20, 2014 18:57:55
Сообщений: 19488
Рейтинг сообщения: 0
melandr писал(а):
const unsigned char speed_lcd[28] = {8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35};

А вот это вообще зачем ? Это же номер (индекс) и есть, сделайте его от 0 до 27 (в обычной переменной) и доставайте из других массивов всякие хитрые числа, а на дисплей выводите индекс +8 если надо.

_________________
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  1,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y