|
|
  |
Управление серводвигателем под FreeRTOS, Управление серводвигателем под FreeRTOS |
|
|
|
Jan 16 2013, 19:17
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
Всем привет! Совсем недавно перешел на FreeRTOS до этого немного работал с С под AVR микроконтроллеры. Сейчас стоит задача подключить 3 серводвигателя к ATmega32 из под FreeRTOS. У меня имеется код который работает без ОС, но при внедрении его в ОС ничего не пашет, точнее ШИМ вроде генерируется но не по параметрам. Я подключил выход к осциллографу и на выходе если я все правильно понимаю у меня через каждую миллисекунду появляется высокий уровень....хотя я задавал период как бы в 20 мс. Короче непонятки какие то...пожалуйста, если у кого либо есть какая либо информация,мысли или наработки поделитесь плз!!!))) и к Курницу не посылать...он мне не отвечает... Если что надо выложить, коды или фотки с осцилла то говорите. Заранее большое спасибо)
|
|
|
|
|
Jan 16 2013, 19:31
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
всмысле?каким образом?конкретнее пожалуйста)
|
|
|
|
|
Jan 16 2013, 19:43
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(robototechnik @ Jan 16 2013, 21:17)  Совсем недавно перешел на FreeRTOS до этого немного работал с С под AVR микроконтроллеры. Сейчас стоит задача подключить 3 серводвигателя к ATmega32 из под FreeRTOS. Скорости хватит? Цитата(robototechnik @ Jan 16 2013, 21:17)  У меня имеется код который работает без ОС, но при внедрении его в ОС ничего не пашет, точнее ШИМ вроде генерируется но не по параметрам. Попробуйте теперь по другому: Вариант 1. Перенести ШИМ на другой таймер. Вариант 2. Отключить запуск Оси. Цитата(robototechnik @ Jan 16 2013, 21:17)  у меня через каждую миллисекунду появляется высокий уровень....хотя я задавал период как бы в 20 мс. Такой период наводит на мысль, что Ось использует тот же таймер что и ваш ШИМ. Либо настройте системный таймер Оси на другой таймер, или поменяйте период системного таймера Оси (в каком-то config-е) Цитата(robototechnik @ Jan 16 2013, 21:17)  Если что надо выложить, коды или фотки с осцилла то говорите. Проект выкладывайте, иначе можно долго гадать. Цитата(_Pasha @ Jan 16 2013, 21:29)  Такие вещи решаются с помощью протеусовского симулятора в течение часа. Или в AVRStudio за 5 минут. А если кто раньше с FreeRtos работал, то можно и без симуляторов по исходнику за те же минуты.
|
|
|
|
|
Jan 16 2013, 19:51
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
скорости пардон чего?)если что у меня кварц на 16 МГц и в Configе стоит период Тика 1000 Гц я заранее извиняюсь я не профи, а любитель) как я могу перенести ШИМ на другой таймер если использую аппаратный ШИМ с помощью Timer1...а аппаратный Timer0 для ШИМ мне так и не удалось запустить... я тоже сразу подумал что этот таймер используется для тиков ОС....но он мне нужен....получается нужно создавать программный...а каким образом???понятия не имею....если есть у кого возможность скиньте пожалуйста конкретный пример полного кода с созданиями всех тасков который генерирует ШИМ на определенной ноге МК с периодом 20 мс и высоким уровнем промежутком от 600мкс до 2400мкс.....буду оооочень благодарен....мне так проще в коде разобраться будет) вот код самой программы а потом за ним конфигурационный файл.....вот это то что я пока что пробовал) #include "FreeRTOS.h" #include "task.h" #include <avr/io.h> /////////////////////////////////////////////////////////////////////////////////////// void vServo( void *pvParameters ) { for (;;) { OCR1A=180; OCR1B=180; vTaskDelay( 5000 / portTICK_RATE_MS); OCR1A=262; OCR1B=262; vTaskDelay( 5000 / portTICK_RATE_MS); OCR1A=375; OCR1B=375; vTaskDelay( 5000 / portTICK_RATE_MS); OCR1A=487; OCR1B=487; vTaskDelay( 5000 / portTICK_RATE_MS); OCR1A=570; OCR1B=570; vTaskDelay( 5000 / portTICK_RATE_MS); } } ///////////////////////////////////////////////////////////////////////////////////////////// int main( void ) { TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11); TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10); ICR1=4999; DDRD = 0b00110000; xTaskCreate( vServo, (signed char * ) "Servo", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); vTaskStartScheduler(); return 0; } #ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H #include <avr/io.h> /*----------------------------------------------------------- * Application specific definitions. * * These definitions should be adjusted for your particular hardware and * application requirements. * * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. * * See http://www.freertos.org/a00110.html. *----------------------------------------------------------*/ #define configUSE_PREEMPTION 1 #define configUSE_IDLE_HOOK 0 #define configUSE_TICK_HOOK 0 #define configCPU_CLOCK_HZ ( ( unsigned long ) 16000000 ) #define configTICK_RATE_HZ ( ( portTickType ) 1000 ) #define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 4 ) #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 500 ) #define configTOTAL_HEAP_SIZE ( (size_t ) ( 1500 ) ) #define configMAX_TASK_NAME_LEN ( 10 ) #define configUSE_TRACE_FACILITY 0 #define configUSE_16_BIT_TICKS 1 #define configIDLE_SHOULD_YIELD 1 #define configQUEUE_REGISTRY_SIZE 1 /* Co-routine definitions. */ #define configUSE_CO_ROUTINES 1 #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) /* Set the following definitions to 1 to include the API function, or zero to exclude the API function. */ #define INCLUDE_vTaskPrioritySet 1 #define INCLUDE_uxTaskPriorityGet 1 #define INCLUDE_vTaskDelete 1 #define INCLUDE_vTaskCleanUpResources 1 #define INCLUDE_vTaskSuspend 1 #define INCLUDE_vTaskDelayUntil 1 #define INCLUDE_vTaskDelay 1 #endif /* FREERTOS_CONFIG_H */
|
|
|
|
|
Jan 16 2013, 20:05
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(robototechnik @ Jan 16 2013, 21:51)  скорости пардон чего?) Скорости света надо полагать... Цитата(robototechnik @ Jan 16 2013, 21:51)  если что у меня кварц на 16 МГц и в Configе стоит период Тика 1000 Гц Не так уж много... Цитата(robototechnik @ Jan 16 2013, 21:51)  как я могу перенести ШИМ на другой таймер если использую аппаратный ШИМ с помощью Timer1...а аппаратный Timer0 для ШИМ мне так и не удалось запустить... Перенесите Шим на T2 или перенесите системный таймер Оси на T0 и задайте другой период (1 миллисекунда не выйдет) Цитата(robototechnik @ Jan 16 2013, 21:51)  я тоже сразу подумал что этот таймер используется для тиков ОС Как бы они 1мс получили на другом таймере... Цитата(robototechnik @ Jan 16 2013, 21:51)  ....но он мне нужен....получается нужно создавать программный...а каким образом??? перенесите прерывание системного таймера на другой вектор. Ессли возможно. Или вам строго 1 мс нужна от системного таймера? Затраты на Ось при этом будут высьма немалыми. Цитата(robototechnik @ Jan 16 2013, 21:51)  вот код самой программы а потом за ним конфигурационный файл.....вот это то что я пока что пробовал) Проект целиком лучше заархивируйте
|
|
|
|
|
Jan 16 2013, 20:08
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
Артём, я могу вас попросить мне разжевать все что я должен сделать пожалуйста...я не понимаю что именно не так...(
|
|
|
|
|
Jan 16 2013, 20:14
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
1. Лезете в port.c для авровского порта, находите там Код void SIG_OUTPUT_COMPARE1A( void ) __attribute__ ( ( signal, naked ) ); И переназначаете его на что-нить другое. 2. Не забываем про инициализацию это находится в static void prvSetupTimerInterrupt( void )
|
|
|
|
|
Jan 16 2013, 20:18
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
окай я нашел эту строку...но как переназначить? инициализацию чего и где вообще?) я извиняюсь еще раз)сильно не бейте)
|
|
|
|
|
Jan 16 2013, 20:19
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(_Pasha @ Jan 16 2013, 22:14)  1. Лезете в port.c для авровского порта, находите там Код void SIG_OUTPUT_COMPARE1A( void ) __attribute__ ( ( signal, naked ) ); И переназначаете его на что-нить другое. 2. Не забываем про инициализацию это находится в static void prvSetupTimerInterrupt( void ) Тип того. а 1000 Hz при том как? (проекта под авр под рукой у меня нет).
|
|
|
|
|
Jan 16 2013, 20:23
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
Артем я вас не понимаю( что тип того?и при чем 1000Гц?
|
|
|
|
|
Jan 16 2013, 20:29
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
я точно не знаю...знаю что мне нужна неплохая точность угла поворота серводвигателя...а так же хорошее быстродействие системы для одновременного опроса сенсоров....вот)
|
|
|
|
|
Jan 16 2013, 20:31
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(robototechnik @ Jan 16 2013, 23:18)  окай я нашел эту строку...но как переназначить? инициализацию чего и где вообще?) я извиняюсь еще раз)сильно не бейте) Ежели Вы уже писали под АВРки, то, надо полагать, в потрохах оных Вы уже разбираетесь? Тама три строчки в шесть рядов  Не морочьте людям голову на ночь  Что у Вас свободно? Timer0? Отлично, на него и вешайте прерывание, даже output compare можно не использовать из любви к искусству, типа такого Код #include <avr/interrupt.h> void SIG_OUTPUT_COMPARE0( void ) __attribute__ ( ( signal,naked ) ); void SIG_OUTPUT_COMPARE0( void ) { vTaskIncrementTick(); asm volatile("reti"); } static void prvSetupTimerInterrupt( void ) - тут устанавливаете все что касается срабатывания таймера 0 с 1мс тиком Я сейчас не пишу под авры, лазать по макабукам - долго. Уж будьте любезны - сами. Если заметили, там функция целиком посвящена именно настройке таймера, и больше ничего. можно смело написать своё, как угодно криво/прямо, лишь бы у Вас пошли прерывания на OCR0 1мс, и отразить это в configTICK_RATE_HZ ЗЫ там подправил чуток, у Вас же preemption будет?
Сообщение отредактировал _Pasha - Jan 16 2013, 20:39
|
|
|
|
|
Jan 16 2013, 20:38
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
не то что бы много писал....так попробовал но думал что хоть немного разбираюсь( забыл уточнить мне 15 лет)так что...пардон иногда недоезжаю) теперь более менее понятно...то есть если я перекину тики на таймер0 то таймер1 освободится и смогу рулить сервами с моим кодом?верно?
|
|
|
|
|
Jan 16 2013, 21:18
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
отлично))большое спасибо)завтра попробую если не получится, я напишу) можно?)хах
не получается((((решил сейчас попробовать...заменил часть которую вы прислали вместо той которая стояла в порт.с....теперь такое ощущение что ОС не тикает вообще)на осциллографе на выходе просто просто одно значение ШИМ генерируется и не обновляется на другое(при чем период так и не изменился(я безнадежен( помогите плз!)
|
|
|
|
|
Jan 17 2013, 13:20
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
теперь компилятор ругается) не компилирует и говорит что 16 ошибок нашел... вот что выдал:
../../../../Source/portable/GCC/ATMega323/port.c:3:16: error: too many decimal points in number ../../../../Source/portable/GCC/ATMega323/port.c:28: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'can' ../../../../Source/portable/GCC/ATMega323/port.c:35: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'even' ../../../../Source/portable/GCC/ATMega323/port.c:38: error: expected identifier or '(' before 'if' ../../../../Source/portable/GCC/ATMega323/port.c:47:55: warning: missing terminating " character ../../../../Source/portable/GCC/ATMega323/port.c:47: error: missing terminating " character In file included from ../../../../Source/portable/GCC/ATMega323/port.c:83: d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:143: error: expected declaration specifiers or '...' before 'size_t' d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:144: error: expected declaration specifiers or '...' before 'size_t' d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:175: error: expected declaration specifiers or '...' before 'size_t' d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:175: error: expected declaration specifiers or '...' before 'size_t' d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:290: error: expected ')' before '__size' d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:302: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__malloc_margin' d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:319: error: expected ')' before '__nele' d:/programm daten/winavr/lib/gcc/../../avr/include/stdlib.h:338: error: expected declaration specifiers or '...' before 'size_t' In file included from D:\Install\FreeRTOSV7.3.0\FreeRTOS\Projects\SUMO\FreeRTOSmain\..\..\..\Source\include/FreeRTOS.h:91, from ../../../../Source/portable/GCC/ATMega323/port.c:86: D:\Install\FreeRTOSV7.3.0\FreeRTOS\Projects\SUMO\FreeRTOSmain\..\..\..\Source\include/portable.h:370: error: expected ')' before 'xSize' D:\Install\FreeRTOSV7.3.0\FreeRTOS\Projects\SUMO\FreeRTOSmain\..\..\..\Source\include/portable.h:373: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'xPortGetFreeHeapSize' ../../../../Source/portable/GCC/ATMega323/port.c: In function 'prvSetupTimerInterrupt': ../../../../Source/portable/GCC/ATMega323/port.c:410: warning: unused variable 'temp' make: *** [port.o] Error 1 Build failed with 16 errors and 4 warnings...
|
|
|
|
|
Jan 17 2013, 16:03
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
какие комментарии?где?
|
|
|
|
|
Jan 18 2013, 19:15
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
ага я понял)хах) я удалил все комментарии в port.c и код скомпилировался)))ура) но всплыли новые проблемы(теперь программа не обновляется...ну не тикает я имею ввиду...ну по крайней мере я так думаю...ШИМ генерируется только с периодом который задан в самом первом значении...и так продолжается бесконечно...хотя по программе значение изменяется каждые 500 мс или сколько там...вот...в чем может быть проблема????????????
|
|
|
|
|
Jan 20 2013, 20:26
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
ребята помогите плиз!!!)
|
|
|
|
|
Jan 22 2013, 18:33
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
окай,значит компилирую я в AVRStudio V4.18 скидываю проект, который у меня лежит в папке с проектами ОС если то еще нужно скажите все сделаю)
Сообщение отредактировал robototechnik - Jan 22 2013, 18:33
Прикрепленные файлы
SUMO.rar ( 71.81 килобайт )
Кол-во скачиваний: 16
|
|
|
|
|
Jan 22 2013, 19:04
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
тогда утром ждать ответа?)
|
|
|
|
|
Jan 22 2013, 19:14
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
окай)жду) спасибо)
|
|
|
|
|
Jan 23 2013, 06:27
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
Volldemar,спасибо,почитаю)
_Pasha,так проблема же с компиляцией уже решена!!!и код заработал,только он не обновляется(ну не тикает в смысле( в том коде который я вам скинул он загружает только первое значение OCR а если дописать второе то он до него не доходит( я эту проблему имел ввиду
|
|
|
|
|
Jan 23 2013, 14:49
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
вот вам целый проект с новым сишным файлом) я вот думаю....может я что то с этой самой таскоперелючалкой натворил?)хах только как? если у вас заработает с моим сишным файлом,то проблема именно в этом) а еще стоит уточнить что при самой первой компиляции сишного файла появляются три ошибки что то про прерывания....я так понимаю это может быть проблемой?но потом все нормально....
Прикрепленные файлы
SUMO.rar ( 72.39 килобайт )
Кол-во скачиваний: 16
|
|
|
|
|
Jan 23 2013, 16:04
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
может я когда комменты в port.c удалял,что то еще не заметив удалил?)
|
|
|
|
|
Jan 23 2013, 17:21
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
_Артём_, ну а я что выложил?) _Pasha, буду оооочень признателен если поможете)
|
|
|
|
|
Jan 23 2013, 17:29
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(robototechnik @ Jan 23 2013, 20:21)  _Артём_, ну а я что выложил?) _Pasha, буду оооочень признателен если поможете) Еще раз повторяю. Берёте симулятор австудии той же. Вот только не помню, там глюк с таймером 0 есть или нет. В любом случае, в протеусе его нет, однозначно. Там другие глюки Жмете F10/F11 до выяснения причины. Заодно и научитесь с симулем работать, а именно - как ставить точки останова и понимать информацию, которая предоставляется симулем.Заодно и ознакомитесь как работают внутренности freeRTOSа. И не забываем о том, что этот гемор - исключительно Ваш, и с ним надо что-то делать исключительно Вам.
|
|
|
|
Guest_TSerg_*
|
Jan 23 2013, 17:44
|
Guests

|
"Мда.., а мы пахали в чистом асме, отладка по шагам кнопкой и наши корабли плавали и плавают" (С)
|
|
|
|
|
Jan 23 2013, 21:23
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
"...этот гемор - исключительно Ваш, и с ним надо что - то делать исключительно Вам..." Форум разработчиков электроники??? что ж...спасибо и на этом)))
Сообщение отредактировал robototechnik - Jan 23 2013, 21:25
|
|
|
|
|
Jan 24 2013, 19:24
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
Что за ОЗУ?памяти под что?Какой задачи?Что за менеджер?Нет чего?Надо 5 чего? согласен)
и вообще как можно в протеусе наблюдать ошибки кода???
|
|
|
|
|
Jan 25 2013, 14:41
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 16-01-13
Пользователь №: 75 214

|
аууу есть кто нибудь на форуме?)))
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|