roboforum.ru

Технический форум по робототехнике.
Текущее время: 26 ноя 2024, 18:22

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Pololu Trex Dual Motor Controller Dmc01
СообщениеДобавлено: 22 апр 2014, 07:14 
Не в сети

Зарегистрирован: 22 апр 2014, 07:10
Сообщения: 5
Здравствуйте, подскажите пожалуйста, имеется STM32F4Discovery и вот этот драйвер http://www.pololu.com/product/777, на Discovery настроил порты, задержка, флаги, USART, отправка команд идет через sprintf, когда запускаю просто светодиод мигает, но двигатели не хотят работать, не могу никак разобраться как довести его до ума


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pololu Trex Dual Motor Controller Dmc01
СообщениеДобавлено: 22 апр 2014, 09:46 
Не в сети
Аватара пользователя

Зарегистрирован: 18 апр 2009, 22:18
Сообщения: 10668
а вы вон те куски кода перепишите и всё заработает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pololu Trex Dual Motor Controller Dmc01
СообщениеДобавлено: 22 апр 2014, 10:15 
Не в сети
Аватара пользователя

Зарегистрирован: 23 апр 2009, 17:03
Сообщения: 2639
Откуда: Москва, Самара
прог. языки: C#
рассказывайте как соединяли, какие перемычки оставляли,
что посылаете, на какой скорости и т.д.
А пока это вопль потерпевшего ниочем :D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pololu Trex Dual Motor Controller Dmc01
СообщениеДобавлено: 22 апр 2014, 11:28 
Не в сети

Зарегистрирован: 22 апр 2014, 07:10
Сообщения: 5
#include "stm32f4xx.h"
#include <stdio.h>

void USART2_ini(void);
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_Init_Usa;
GPIO_InitTypeDef GPIO_Init_Button;
void Button_ini(void);

uint16_t delya_count=0;
void SysTick_Handler(void)
{
if (delya_count>0)
{
delya_count--;
}
}

void delay_ms(uint16_t delya_temp)
{
delya_count = delya_temp;
while(delya_count){}
}

void SendStrtoPC(char* str_p, uint16_t count)
{
uint16_t i=0;
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1)
{
while(i< count)
{
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE)==RESET){}
USART_SendData ( USART2, str_p[i]);
i++;
}
}
}

int main (void)
{
char str[30];
SysTick_Config(SystemCoreClock/1000);
USART2_ini();
Button_ini();
sprintf(str, "0xC2,1023");

while(1)
{
delay_ms(500);
SendStrtoPC(str, 30);
}
}



void USART2_ini(void)
{
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
}

{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
USART_Init_Usa.USART_BaudRate = 9600;
USART_Init_Usa.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init_Usa.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
USART_Init_Usa.USART_Parity = USART_Parity_No;
USART_Init_Usa.USART_StopBits = USART_StopBits_1;
USART_Init_Usa.USART_WordLength = USART_WordLength_8b;
USART_Init(USART2, &USART_Init_Usa);
USART_Cmd(USART2, ENABLE);
}
}
void Button_ini(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_Init_Button.GPIO_Pin = GPIO_Pin_0;
GPIO_Init_Button.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init_Button.GPIO_OType = GPIO_OType_PP;
GPIO_Init_Button.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init_Button.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_Init_Button);
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);

}

на драйвере имеется СОМ порт (RX TX GND), соответственно PORTA3 на TX, PORTA2 на RX, GND на GND. Скорость передачи 9600.

Посылаются команды вот часть из них:

0xC8 – 0xCB: set motor 2
This command takes one data byte and returns nothing. It immediately sets the speed of the
specified motor equal to the data byte and the motor direction based on the two least significant
bits of the command byte. The direction bits work as follows:
00 = brake low (command 0xC0/0xC8)
01 = reverse (command 0xC1/0xC9)
10 = forward (command 0xC2/0xCA)
11 = brake low (command 0xC3/0xCB)

0xC4 – 0xC7: accelerate motor 1
0xCC – 0xCF: accelerate motor 2
This command takes one data byte and returns nothing. It sets the target speed of of the
specified motor equal to the data byte and the target motor direction based on the two least
significant bits of the command byte. The direction bits work as follows:

00 = brake low (command 0xC4/0xCC)
01 = reverse (command 0xC5/0xCD)
10 = forward (command 0xC6/0xCE)
11 = brake low (command 0xC7/0xCF)

Motor speed is updated 100 times per second. If it is below its target speed and if its current
direction is the same as its target direction, each update will adjust the speed by increasing it by
a tenth of its acceleration parameter. If it is above its target speed and its direction is in the
target direction, the update will merely set its speed equal to the target value (i.e. there is no
deceleration). Every 10ms, the following acceleration logic is performed:
if motor speed < target speed, motor speed = motor speed + acceleration/10
if motor speed > target speed, motor speed = target speed
If the target direction differs from the current direction, the first update will brake the motor at
100% duty cycle for the amount of time specified by the its brake duration parameter. It will
then set the motor speed to zero and accelerate from there to the target speed in the target
direction.
If you intend to use the current-limiting feature of the TReX, you should use acceleration
commands to control your motor speed. This is because acceleration commands schedule
motor updates to happen as part of a fixed update cycle that also takes care of the current-
limiting logic. “Set motor” commands set the motor speed the instant they're received and will,
at least temporarily, override any current-limiting actions the TReX is taking. If you want to
limit your current but you don't want acceleration, set the acceleration parameter to zero; this
essentially requests infinite acceleration.
Note: acceleration does not apply to braking or to a speed decrease that does not also result in a
change of direction. Motor speed can also be influenced by current-limit settings, which add
additional considerations to the logic detailed in this section. Please see the current limit
section of the parameter documentation for more details.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pololu Trex Dual Motor Controller Dmc01
СообщениеДобавлено: 22 апр 2014, 13:29 
Не в сети
Аватара пользователя

Зарегистрирован: 23 апр 2009, 17:03
Сообщения: 2639
Откуда: Москва, Самара
прог. языки: C#
Попробуйте понять, живой ли драйвер вообще,
и правильно ли соединения, см. post297916.html#p297916


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pololu Trex Dual Motor Controller Dmc01
СообщениеДобавлено: 22 апр 2014, 18:57 
Не в сети

Зарегистрирован: 22 апр 2014, 07:10
Сообщения: 5
конечно живой, через терминал на полную работает

Добавлено спустя 2 минуты 57 секунд:
так как и через конфигуратор

Добавлено спустя 1 час 2 минуты 2 секунды:
приложение от Popolu ( конфигуратор) ну и переходник USB USART


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pololu Trex Dual Motor Controller Dmc01
СообщениеДобавлено: 22 апр 2014, 19:13 
Не в сети
Аватара пользователя

Зарегистрирован: 23 апр 2009, 17:03
Сообщения: 2639
Откуда: Москва, Самара
прог. языки: C#
могу предположить, что скорость порта 19200
не выставлена на стороне STM
Ну в смысле вы выставили 9600, а надо (возможно) 19200,
но у меня DMC-2, может у вас по другому


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pololu Trex Dual Motor Controller Dmc01
СообщениеДобавлено: 23 апр 2014, 09:12 
Не в сети

Зарегистрирован: 22 апр 2014, 07:10
Сообщения: 5
так оно и есть, baud rate 9600 стоит, хотя на драйвере стандартно идет 19200, но если я ставлю 19200 на STM, то при отправке драйвер вообще никак не реагирует, а так хотя бы диод мигает))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pololu Trex Dual Motor Controller Dmc01
СообщениеДобавлено: 23 апр 2014, 12:24 
Не в сети
Аватара пользователя

Зарегистрирован: 23 апр 2009, 17:03
Сообщения: 2639
Откуда: Москва, Самара
прог. языки: C#
Как то это необычно. Может в STM прошивке неправильно указаны частоты
кварца? Подергайте точно ножкой и через анализатор поглядите правильной ли длины
импульс... :o


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pololu Trex Dual Motor Controller Dmc01
СообщениеДобавлено: 23 апр 2014, 13:11 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Artemmm писал(а):
живой, через терминал на полную работает
тогда подайте команды на терминал и убедитесь то они верны.

Может ему 5 вольт логику надо?

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pololu Trex Dual Motor Controller Dmc01
СообщениеДобавлено: 26 апр 2014, 15:02 
Не в сети

Зарегистрирован: 22 апр 2014, 07:10
Сообщения: 5
а есть разница, я настроил USART на передачу строки?))

Добавлено спустя 7 минут 21 секунду:
ну т.е. отправка "hellow world"


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

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


Кто сейчас на конференции

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


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

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO