Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/43: Рейтинг темы: голосов - 43, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87

Управление сервоприводом

11.01.2013, 00:56. Показов 8762. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Снова нужна помощь сообщества :) Пытаюсь прикрутить к коду, представленному ниже, управление ШИМом, чтобы рулить сервомотором. От кнопки должно прилетать прерывание, после чего включается светодиод и серв устанавливается в какое-нибудь заданное положение. Никак не получается сдвинуть серво. Очень хочу понять как управлять им на примере приведённого кода.

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include  <msp430g2553.h>
 
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= BIT0;
P1REN |= BIT3;
P1OUT |= BIT3;
P1IE |= BIT3;
P1IES |= BIT3;
P1IFG &= ~BIT3;
 
_BIS_SR(LPM0_bits + GIE);
}
 
// Port 1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
P1OUT ^= BIT0;
P1IFG &= ~BIT3;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.01.2013, 00:56
Ответы с готовыми решениями:

Управление сервоприводом по Wi-Fi
Всем привет! Вопрос вот в чем: Есть wi-fi модуль, микроконтроллер и дальше сервопривод. Как послать команду на это все дело используя...

Управление сервоприводом (мой вариант)
Уважаемые форумчане - нужна Ваша помощь! Помогите решить такую задачу 1. Имеется сервомашинка MG995, хочу установить ее (2 шт) для...

Управление сервоприводом
есть сервомашинка переделанная под постоянное вращение(убран реостат и ограничитель хода).. Поскольку с ними я сталкиваюсь первый раз,у...

11
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
11.01.2013, 03:19
Ага, вроде разобрался. Код:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include  <msp430g2553.h>
 
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= (BIT0 + BIT6);
P1REN |= BIT3;
P1OUT |= BIT3;
P1SEL |= BIT6;
P1IE |= BIT3;
P1IES |= BIT3;
P1IFG &= ~BIT3;
TA0CCR0 = 20000-1;
TA0CCR1 = 1999;
TA0CCTL1 = OUTMOD_7;
TA0CTL = TASSEL_2 + MC_1;
 
_BIS_SR(LPM1_bits + GIE);
}
 
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
TA0CCR1 = 1000;
P1IFG &= ~BIT3;
}
И тут ещё пара вопросов: Правильно ли выставлен бит режима энергопотребления? Как сделать так, чтобы при нажатии комбинации, к примеру, трёх клавиш серво переключался в положение 1000? Типа кодовый замок такой простенький. Примерно представляю, что нужно задать массив из трёх значение и сравнивать его с введённой комбинацией, но дальше теории у меня мозг пока не тянет. И ведь примеров как в англоязычной, так и в русскоязычной части сети совсем нет. Если только попробовать перенести код с другого мк (avr например), но там я тоже дуб дубом, хотя попробовать можно.
0
Sir60
13.01.2013, 01:37
Бит режима энергопотребления выставлен правильно. Если ожидается прерывание только от порта и генераторы не нужны для таймерож и пр. во время сна, то МК можно погрузить в режим LPM4. Токопотребление снизится существенно.

А по поводу приема кода с клавиатуры, в Интернете полно информации. В конце концов, возьмите код для любого другого МК и адаптируйте его к MSP430. Главное - понять принцип.
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
13.01.2013, 22:25
Цитата Сообщение от Sir60
Бит режима энергопотребления выставлен правильно. Если ожидается прерывание только от порта и генераторы не нужны для таймерож и пр. во время сна, то МК можно погрузить в режим LPM4. Токопотребление снизится существенно.

А по поводу приема кода с клавиатуры, в Интернете полно информации. В конце концов, возьмите код для любого другого МК и адаптируйте его к MSP430. Главное - понять принцип.
Спасибо за ответ. Вот думаю в конечном варианте кода ещё использовать прерывания от АЦП (пусть мк мерит своё напряжение).
Буду копать код в сторону аврок.
0
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
14.01.2013, 00:48
Сколько не искал, все прошивки только ан асме( Есть тут неплохой пример http://sxim.net/mc/ms130.php , но код слишком наворочен для меня.
0
Sir60
16.01.2013, 01:34
Я так понял, что Вы не читаете код на асме для AVR. Тогда посмотрите здесь для х51. Там все разжевано в смысле функционирвания и даже есть блок-схема алгоритма. Могу прислать свой код на асме для х51, если поможет. На MSP430 программировать клавиатуру мне пока не нужно было.
http://www.edsym51.com/8051Not... tml#keypad
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
16.01.2013, 19:06
Цитата Сообщение от Sir60
Я так понял, что Вы не читаете код на асме для AVR. Тогда посмотрите здесь для х51. Там все разжевано в смысле функционирвания и даже есть блок-схема алгоритма. Могу прислать свой код на асме для х51, если поможет. На MSP430 программировать клавиатуру мне пока не нужно было.
http://www.edsym51.com/8051Not... tml#keypad
Спасибо за ссылку. К сожалению я в асме мало чего понимаю. В статье говорится о сканировании клавиатуры 4х4. Там ведь сканируются оси х и у. С тремя кнопками думаю должно всё быть проще, вот только разобраться бы :) Буду дальше ковыряться
0
Sir60
16.01.2013, 21:43
Посмотрите еще здесь:
http://www.ti.com/lit/an/slaa139/slaa139.pdf
Секцию 5.5.5 в
http://www.ti.com/lit/an/slaa024/slaa024.pdf
и главу 7.2.2 в книге "MSP430 Microsontroller Basics" , Johm H. Davies.
Где-то видел ее в сети для скачивания.
Sir60
17.01.2013, 04:39
Поразмыслив еще на досуге над Вашим вопросом и перечитав его внимательно, мне кажется, что я его не так понимал ранее. Вам нужно в зависимости от комбинации нажатия 3-х кнопок повернуть серво на определенный угол. Если обозначить кнопки через A,B,C, то, скажем, комбинация OOS должна соответствовать одному углу, а, например, BCA - другому. Если так, то для 3-х кнопок будет всего 27 различных комбинаций. Заведем массив длины 27, в котором будут находиться коды, посылаемые на серво. Задача таким образом, сводится к вычислению индекса массива (от 0 до 26) в зависимости от комбинации нажатий 3-х кнопок.

Присвоим кнопке А число 0, кнопке B - число 1, и кнопке C - число 2. Тогда комбинации OOS из примера выше будет соответствовать число 002, а комбинации BCA - число 230. Будем рассматривать это число как число представленное в троичной системе счисления. Для вычисления индекса массива нужно будет просто перевести его в десятичную систему. Вычисления производятся по формуле
index = K1*9 + K2*3 + K3,
где К1,К2,К3 - числа, соответствующие первой, второй, и третьей нажатым кнопкам, соответственно. Например, для комбинации OOS получим index = 0*9 + 0*3 + 2 = 2, а для комбинации BCA получим index = 1*9 + 2*3 + 0 = 15.
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
17.01.2013, 19:23
Вот! Всё казалось бы так просто, но до чего я так и не смог додуматься! В итоге можно сделать даже из двух кнопок, а третью нажимать, когда хотим ввести код. Получается в обработчике прерываний можно применить метод switch case. Вот только у меня пока трудности с синтаксисом СИ и не знаю как присвоить кнопке какое-то значение. Почему-то на примерах, которые я встречал, нигде не видел такого или видел, но не понял ничего.
И ещё вопрос: почему именно такая формула для вычисления индекса? Ну то есть я понимаю почему 27 значений, но с выводом формулы чего-то разобраться не могу.
0
Sir60
17.01.2013, 20:30
Формула эта вытекает из алгоритма перевода чисел их троичной системы в десятичную. Почитайте Википедию про системы счисления. Вот примерный код для вычисления индекса:

Code
1
2
3
4
5
int index = 0;
for (i=0; i<3; i++)
{
index = index*3 + getButton();
}
Присваивание кода кнопке можно сделать в процедуре типа такой:

Code
1
2
3
4
5
6
7
int getButton(void)
{
ждем прерывания от нажатия кнопки
if (нажата кнопка К1) return(0);
if (нажата кнопка K2) return(1);
if (нажата кнопка K3) return(2);
}
x-omtr
29.01.2013, 15:02
Я так понял МК будет в спящем режиме? тогда пусть он будет просыпаться от прерывания от порта. В обработчике смотрим с какой ноги порта пришел запрос, ну и записываем соответствующее значение куда-либо.

Касательно сервы. Нужны 2 положения? Тоесть, динамического изменения ее положения не будет? Тогда советую ШИМ повесить на таймер, а положение переключать сменой значения в регистре таймера.

А 27 комбинаций из 3 кнопок вытекают из освнов комбинаторики (имеем 3 знакоместа, для каждого из которых имеем по 3 возможных значения)

Хотя я что-то затупил, автор использует ногу МК в качестве вывода PWM. Я же привык писать 1-2 ШИМ канала вручную в обработчике прерывания от таймера.

а импульсы на все сервы одинаковые должны быть (разве что плюсминус маленькие проценты) частота ШИМа 50-100 Гц (моя и на 200 работала))) и вычислить длину импульса несложно опытным путем (опять же при писанине вручную) вот теория и числа
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.01.2013, 15:02
Помогаю со студенческими работами здесь

управление сервоприводом кнопкой
Доброго времени суток ув.Форумчане! В электротехнике не силен, но вот тут пришлось столкнуться с Ардуинкой ибо без нее не как. в общем...

Аналоговое управление сервоприводом
Здравствуйте, электроникой занимаюсь совсем недавно. Только на днях собрал свою первую плату. Как-то прочитал статью ди хальта о...

управление сервоприводом используя геймпад от ps2
Доброго времени суток. Подскажите как изменяя положение джойстика на геймпаде менять положение сервопривода от 0-180 градусов

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

Проблема с сервоприводом Arduino
У меня возникли некие проблемы из-за сервопривода. Я хотел сделать чтобы на меньшую температуру крутился в противоположную, а с высокой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru