Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Вт ноя 08, 2022 14:43:35
здравствуйте, я переделал ардуино уно на атмега 16 написал угломер по энкодеру и в коде генерируется импульс после полного оборота, может есть у кого код преобразования импульса из переменной в количество оборотов? типа тахометра и вывод на дисплей 16х2
}
else // Вращение шпинделя влево
{
Spindle_Direction = Spindle_Direction_CCW;
Enc_Pos--;
if (Enc_Pos < 0) // полный оборот
{
Enc_Pos = Enc_Line - 1;
TahoSetPulse(); // при проходе 0 генерим сигнал Taho
if (Mode_On_flag == true) // проверка режима на ON/OFF, только! после прохода 0 разрешаем счет до к.деления
{
Step_On_flag = true;
}
}
}
Вт ноя 08, 2022 17:20:31
А сосчитать число импульсов за 1 секунду уже ну никак?
Ср ноя 09, 2022 12:00:44
Частотомер / периодомер...
Только вот мега 16 это уже не нанка в принципе - надо ставить платформу MightyCore и соответственно раскладку выводов делать.
Ср ноя 09, 2022 12:20:26
Странный вопрос: коль энкодер, так, значит квадратурный - так? Коль квадратурный, то подключен к таймеру - так? Коль к таймеру подключен, то что мешает связать с ним другой таймер по достижению нужного количества отсчетов и считать обороты чисто аппаратно? Ну, а ежели аврка так не умеет, можно в прерывании того самого таймера счетчик инкрементировать/декрементировать (только нужно иметь флаг, в какую сторону переполнение произошло).
Сб ноя 12, 2022 07:37:31
я переделал на атмегу 8535 , скетч переписал на нее и привел код в рабочее состояние, дальше будет развитие на управление шаговым мотором в зависимости от числа оборотов, угол по энкодеру уже считает данный скетч, у энкодера три канала выхода ABZ , Z канал это один импульс на оборот , на меге 8535 есть INT2 я когда прописываю третье прерывание по внешнему признаку, только когда я подключаю к нему импульсы то все остальные прерывания не работают, attachInterrupt(2, fan_interrupt, FALLING); эта команда с атмегой 8535 не работает, может у кого есть код как включить все три прерывания?
Сб ноя 12, 2022 09:41:41
Вообще-то D2 это INT0...
Syntax
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (recommended)
attachInterrupt(interrupt, ISR, mode); (
not recommended)
attachInterrupt(pin, ISR, mode) ; (not recommended Arduino Due, Zero only)
для "стандартного" референса INT2 недоступно, там надо таки много покопаться и в дебрях IDE и в описании платформы MightyCore (с учетом вариантов раскладки выводов - их там аж три имеется - стандартный, sanguino и bobuino)...
Сб ноя 12, 2022 10:11:56
3 прерывания ATmega8535 работают. Попробовал с 3-мя действиями со светодиодами.
- Код:
attachInterrupt(0, fan_interrupt_0, FALLING);
attachInterrupt(1, fan_interrupt_1, FALLING);
attachInterrupt(2, fan_interrupt_2, FALLING);
- Вложения
-
- 3_int.jpg
- (180.62 KiB) Скачиваний: 62
Сб ноя 12, 2022 12:57:19
а как в скетче прописывал? можешь скинуть ?
Добавлено after 58 seconds:
у меня при включении третьего прерывания все гаснет и виснет,
для "стандартного" референса INT2 недоступно, там надо таки много покопаться и в дебрях IDE и в описании платформы MightyCore (с учетом вариантов раскладки выводов - их там аж три имеется - стандартный, sanguino и bobuino)...
а как прописать чтобы третье прерывание заработало?
Сб ноя 12, 2022 13:23:36
На схеме со светиками раскладка кристалла...НО...
имена прерываний "по ардуиновски" будут отличаться
для bobuino
int0 - D2
int1 - D3
int2 - D6
или для "стандарт"
int0 - D10
int1 - D11
int2 - D2
то же и для "sanguino" (там другие выводы меняются)
int0 - D10
int1 - D11
int2 - D2
конкретика какая платформа выбрана (и соответственно загрузчик и фузы) надо выставить в соответствующих вкладках IDE - компилятор будет вести обработку имен выводов согласно выбранной платформы (строка pinout)

Последние данные лучше посмотреть на сайте:
https://github.com/MCUdudehttps://github.com/MCUdude/MightyCore
Сб ноя 12, 2022 13:43:46
MightyCore -> ATmega8535, Internal Clock 8 MHz
Соотв. прерывание поднимает соотв. флаг.
Файл Proteus (v8.13) внутри.
Спойлер
- Код:
bool ch_0 = false;
bool st_0 = false;
bool ch_1 = false;
bool st_1 = false;
bool ch_2 = false;
bool st_2 = false;
void setup() {
pinMode(PIN_A0, OUTPUT);
pinMode(PIN_A1, OUTPUT);
pinMode(PIN_A2, OUTPUT);
attachInterrupt(0, fan_interrupt_0, FALLING);
attachInterrupt(1, fan_interrupt_1, FALLING);
attachInterrupt(2, fan_interrupt_2, FALLING);
}
void loop() {
if (ch_0) {
digitalWrite(PIN_A0, st_0);
ch_0 = false;
}
if (ch_1) {
digitalWrite(PIN_A1, st_1);
ch_1 = false;
}
if (ch_2) {
digitalWrite(PIN_A2, st_2);
ch_2 = false;
}
}
void fan_interrupt_0() {
ch_0 = true;
st_0 ^= 1;
}
void fan_interrupt_1() {
ch_1 = true;
st_1 ^= 1;
}
void fan_interrupt_2() {
ch_2 = true;
st_2 ^= 1;
}
- Вложения
-
- sketch_nov12b.zip
- (32.75 KiB) Скачиваний: 69
Последний раз редактировалось
veso74 Сб ноя 12, 2022 13:47:26, всего редактировалось 1 раз.
Сб ноя 12, 2022 13:46:37
вторую ссылку пробовал пишет что эта библиотека атмегой не поддерживается
Сб ноя 12, 2022 13:48:39
Arduino IDE какая версия установлено?
Устанавливается нормально. Win7 64 bit, Arduino IDE v1.8.19
- Вложения
-
- ard.jpg
- (122.74 KiB) Скачиваний: 56
Сб ноя 12, 2022 13:51:07
1.8.19 32 бит
Сб ноя 12, 2022 13:56:04
Это прожка под использование PCINT, а не набора INT0-INT2, что также требует некоторой "алхимии" с установкой библиотек.
Исходно у
vik vik взяты за основу "стандартные" прерывания платформ для IDE.
Сб ноя 12, 2022 13:56:56
Просто скачайте архива библиотеки и распаковайте архив в MyDoc/Arduino/hardware
(убрать ...-master с имя папки)
- Вложения
-
- Untitled-2.jpg
- (73.75 KiB) Скачиваний: 99
Сб ноя 12, 2022 14:00:45
Ошибка компиляции для платы ATmega8535.
вот такую хрень выдал
Сб ноя 12, 2022 14:01:59
Сделайте скрийншот настройки выбранного микроконтроллера в Arduino IDE.
Сб ноя 12, 2022 14:04:47
выбран стандарт , а под какой вариант эта библиотека?
Сб ноя 12, 2022 14:06:06
Не понял вопрос о вариантах?
---
Это прожка под использование PCINT, а не набора INT0-INT2...
Нет. Посм. файл WInterrupts.c.
Спойлер
- Код:
// ATmega8, ATmega8515, ATmega8535, ATmega16, ATmega32, ATmega162
#elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) \
|| defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) || defined(__AVR_ATmega162__)
case 0:
MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
GICR |= (1 << INT0);
break;
case 1:
MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10);
GICR |= (1 << INT1);
break;
case 2:
#if defined(INT2)
#if defined(EMCUCR)
EMCUCR = (EMCUCR & ~((1 << ISC2))) | ((mode & 0x01) << ISC2); // ATmega8515/162
#else
MCUCSR = (MCUCSR & ~((1 << ISC2))) | ((mode & 0x01) << ISC2); // ATmega8535/16/32
#endif
GICR |= (1 << INT2);
#endif
break;
Сб ноя 12, 2022 14:09:23
вот варианты
- Вложения
-
- скрин.jpg
- (158.89 KiB) Скачиваний: 65
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.