Помаленьку АПгрейдирую квадроцикл ребенка
2 года - первые попытки рулить...
3 года - уверено рулит, хотя часто отвлекается и еще не может правильно рассчитать сложные маневры (сбивает углы задними колесами, сложно рулить задним ходом)
4 года - правтически не цепляет и не врезается никуда, почти не отвлекается (даже если отвлекается, удерживает траекторию движения) , боле-менее нормально рулит задним ходом...
...
что уже было сделано
1) аккумултор заменен на литий 3s16p - позволило значимо увеличить время катания (примерно 1 час по бездорожью, до 3 часов по ровной дороге)
2) переделана подвеска , добавлены пружины (ход 3 см) , задняя подностью переделана , полунезависимая, подпружиненная - на бездорожье и щебенке значимо стало комфортнее ребенку, улучшено сцепление с дорогой за счет подвести (колеса меньше и реже подвисают)
3) силовая честь переделана на реле , ибо пиковые токи огромны!
4) установлено еще 2 мотора - на передние колеса! = теперь полный привод!! - проходимость просто бомбическая!!
---
Ну и теперь добрался до перехода с педали на ручку газа
С китая заказал ручку
Контроллер реализовал на МК AtTiny85
пока что выполняет единственную функцию = ручка газа - ШИМ моторов...
Скетч простейший, без каких либо изыской, защит, прибамбасов = дальше он будет еще дополнятся и усложнятся, нол минимально этого достаточно!
Всё сделано под ардуину (среда ардуины и SPI программатор из ардуино мини)
//#define F_CPU 1200000UL //(1.2мгц)
#include <avr/io.h>
#include <avr/interrupt.h>
#define MOTOR PB0 // OC0A (5)
#define STOP PB1 // OC0B (6)
#define GAZ PB4 //ADC2 (3)
#define P_IN PB3 // (2)
#define P_OUT PB2 // (7)
uint8_t stp = 0;
// Обработчик прерывания по завершению преобразования АЦП
ISR(ADC_vect)
{
// Записываем значение, полученное на выходе АЦП в регистры сравнения таймера.
// Здесь же, задаём минимальный порог свечения светодиода, после которого он будет гарантированно гаснуть
uint16_t t = ADCH;
t = (t < 46) ? 0 : (t-45);
t = t * 164 / 100;
//t = (t-45)*1.64; //подгоняю показания ручки 0.8-4.2В (45-200) под диапазон 0-255
t = (t > 255) ? 255 : t;
OCR0A = t;
OCR0B = t;
// OCR0A=(t < 45) ? 0 : t;
// OCR0B=(t > 200) ? 255: t;
}
int main(void)
{
// выходы:
DDRB |= (1 << MOTOR)|(1 << LED1); // выходы = 1
PORTB &= ~((1 << MOTOR)|(1 << LED1)); // по умолчанию отключены = 0
// Ручка газа (переменный резистор):
DDRB &= ~(1 << GAZ); // вход = 0
// Таймер для ШИМ:
TCCR0A = 0xB1; // режим коррекции фазы ШИМ, неинверсный сигнал на выходе OC0A, инверсный - на выходе OC0B
TCCR0B = 0x03; // предделитель тактовой частоты CLK/64
TCNT0 = 0; // начальное значение счётчика
OCR0A = 0; // регистр сравнения A
OCR0B = 0; // регистр сравнения B
// Настройка АЦП:
ADMUX = 0x22; // опорное напряжение - VCC, левое ориентирование данных, выбран вход ADC2 (на нём висит перем. резистор)
ADCSRA = 0xEA; // АЦП включен, запуск преобразования, режим автоизмерения, прерывание по окончанию преобразования, частота CLK/4
ADCSRB = 0x00; // режим автоизмерения: постоянно запущено
DIDR0 |= (1 << GAZ); // запрещаем цифровой вход на ноге аналогового входа
sei(); //разрешаем глобально прерывания
while(1)
{
}
}
как видим - тут аппаратный ШИИ по прерыванию
частота МК выбрана 8мгц
делитель 64
АЦП под стандартную ручку газа 0.8-4.2В на выходе которой
код с комментариями
размер минимальный (262 байта всего) - можно даже в tiny 10 зашить )