====== Двигатели ====== //Связан с модулем: [HW] [[ru:hardware:homelab:motor]]// Библиотека двигателей позволяет управлять модулем двигателей и двигателями, которые туда подключаются. Существуют функции управления двигателями постоянного тока, шаговыми двигателями и серводвигателями. ===== Типы данных ===== * **//prescale//** \\ Способ выбора тактового делителя. Рекомендуется использовать два первых тактовых делителя: * //TIMER2_NO_PRESCALE// - Делитель не используется. * //TIMER2_PRESCALE_8// - Коэффициент деления 8. * //TIMER2_PRESCALE_64// - Коэффициент деления 64. * //TIMER2_PRESCALE_256// - Коэффициент деления 256. * //TIMER2_PRESCALE_1024// - Коэффициент деления 1024. ===== Функции ===== * **//void dcmotor_init(unsigned char index)//** \\ Настройка управляющих выводов одного контроллера двигателя постоянного тока выходом. Параметры: * //index// - Номер контроллера. Значение от 0 до 3. * **//void dcmotor_drive(unsigned char index, signed char direction)//** \\ Управляющий приказ контроллера двигателя постоянного тока. Параметры: * //index// - Номер контроллера. Значение от 0 до 3. * //direction// - Полярность двигателя. Значение -1, 0 или +1. В случае 0 мотор остановлен, в других случаях вращается в соответствующую сторону. * **//void dcmotor_drive_pwm_init(unsigned char index, timer2_prescale prescaler)//** \\ Настройка управляющих выводов одного контроллера двигателя постоянного тока выходом с регулировкой скорости. Вдобавок можно указать желаемый тактовый делитель, в зависимости нужной частоты ШИМ. Параметры: * //index// - Номер контроллера. Значение от 0 до 3. * //prescaler// - Выбор тактового делителя. Желательно использовать тактовый делитель, т.к. прерывания, происходящие очень быстро, могут нарушить работу программы. Например, при использовании UH датчика необходимо тактовым делителем определить TIMER2_PRESCALE_8. * **//void dcmotor_drive_pwm(unsigned char index, signed char direction, unsigned char speed) //** \\ Управляющий приказ одного контроллера двигателя постоянного тока. Двигатель вращается в заданном направлении и с указанной скоростью. Параметры: * //index// - Номер контроллера. Значение от 0 до 3. * //direction// - Полярность двигателя. Значение -1 или +1. * //speed// - Скорость двигателя. Значение от 0 до 255. В случае с 0 двигатель остановлен, а в случае с 255 – это максимально возможная скорость. * **//void unipolar_init(unsigned char index)//** \\ Настройка управляющих выводов контроллера униполярного шагового двигателя выходом. Параметры: * //index// - Номер контроллера. Значение от 0 до 1. * **//void unipolar_halfstep(unsigned char index, signed char direction, unsigned short num_steps, unsigned char speed)//** \\ Управляющий приказ полушага контроллера униполярного шагового двигателя. Параметры: * //index// - Номер контроллера. Значение от 0 до 1. * //direction// - Направление вращения. Значение от -1 или +1. * //num_steps// - Число полушагов. * //speed// - Время выполнения одного шага в миллисекундах. * **//void bipolar_init(void)//** \\ Настройка управляющих выводов контроллера биполярного шагового двигателя выходом. * **//void bipolar_halfstep(signed char direction, unsigned short num_steps, unsigned char speed)//** \\ Управляющий приказ полушага контроллера биполярного шагового двигателя. Функция блокирующаяся, т.е. она выполняется до тех пор, пока не будет сделано желаемое количество шагов. Параметры: * //direction// - Направление вращения. Значение от -1 или +1. * //num_steps// - Число полушагов. * //speed// - Выполнение одного шага в миллисекундах. * **//void servomotor_init(unsigned char index)//** \\ Настройка управляющих выводов одного серводвигателя выходом и настройка таймера 1 в режим ШИМ. Параметры: * //index// - Номер серводвигателя. Значение 0 или 1. * **//void servomotor_position(unsigned char index, signed short position)//** \\ Управляющий сигнал серводвигателя. Если происходит управление позиционируемым серводвигателем, то меняется положение ротора, если же бесконечно вращающимся, то меняется скорость вращения. Параметры: * //index// - Номер серводвигателя. Значение 0 или 1. * //position// - Положение ротора или скорость вращения (в зависимости от двигателя). Значение от -100 до +100. В случае 0 – это среднее положение или остановка. ===== Пример ===== Следующий пример демонстрирует все функции библиотеки. По порядку настраиваются контроллеры и вращаются двигатели. #include int main(void) { // Настройка контроллеров 0 и 1 двигателей постоянного тока dcmotor_init(0); dcmotor_init(1); // Настройка контроллера биполярного шагового двигателя bipolar_init(); // Настройка управляющих сигналов серводвигателей 0 и 1 servomotor_init(0); servomotor_init(1); // Один двигатель постоянного тока вращается в одну сторону, // другой в противоположную сторону dcmotor_drive(0, -1); dcmotor_drive(1, +1); // Шаговый двигатель вращается 100 градусов в одну сторону // И затем в два раза быстрее в другую сторону bipolar_halfstep(1, 100, 50); bipolar_halfstep(-1, 100, 25); // Вращение серводвигателей в противоположном направлении servomotor_position(0, -100); servomotor_position(1, +100); } Пример демонстрирует регулировку скорости двигателя постоянного тока. #include int main(void) { unsigned char speed = 0; // Инициализация двигателя dcmotor_drive_pwm_init(0, TIMER2_NO_PRESCALE); while(1) { speed = 100; // Установка двигателю заданной скорости dcmotor_drive_pwm(0, 1, speed); } }