реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Управление серводвигателем под FreeRTOS, Управление серводвигателем под FreeRTOS
robototechnik
сообщение Jan 16 2013, 19:17
Сообщение #1


Участник
*

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



Всем привет!
Совсем недавно перешел на FreeRTOS до этого немного работал с С под AVR микроконтроллеры. Сейчас стоит задача подключить 3 серводвигателя к ATmega32 из под FreeRTOS. У меня имеется код который работает без ОС, но при внедрении его в ОС ничего не пашет, точнее ШИМ вроде генерируется но не по параметрам. Я подключил выход к осциллографу и на выходе если я все правильно понимаю у меня через каждую миллисекунду появляется высокий уровень....хотя я задавал период как бы в 20 мс. Короче непонятки какие то...пожалуйста, если у кого либо есть какая либо информация,мысли или наработки поделитесь плз!!!))) и к Курницу не посылать...он мне не отвечает... Если что надо выложить, коды или фотки с осцилла то говорите.
Заранее большое спасибо)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 16 2013, 19:29
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Такие вещи решаются с помощью протеусовского симулятора в течение часа.
Go to the top of the page
 
+Quote Post
robototechnik
сообщение Jan 16 2013, 19:31
Сообщение #3


Участник
*

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



всмысле?каким образом?конкретнее пожалуйста)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 16 2013, 19:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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 работал, то можно и без симуляторов по исходнику за те же минуты.
Go to the top of the page
 
+Quote Post
robototechnik
сообщение Jan 16 2013, 19:51
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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 */

Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 16 2013, 20:05
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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) *
вот код самой программы а потом за ним конфигурационный файл.....вот это то что я пока что пробовал)


Проект целиком лучше заархивируйте
Go to the top of the page
 
+Quote Post
robototechnik
сообщение Jan 16 2013, 20:08
Сообщение #7


Участник
*

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



Артём, я могу вас попросить мне разжевать все что я должен сделать пожалуйста...я не понимаю что именно не так...(
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 16 2013, 20:14
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



1. Лезете в port.c для авровского порта, находите там
Код
void SIG_OUTPUT_COMPARE1A( void ) __attribute__ ( ( signal, naked ) );

И переназначаете его на что-нить другое.

2. Не забываем про инициализацию
это находится в static void prvSetupTimerInterrupt( void )
Go to the top of the page
 
+Quote Post
robototechnik
сообщение Jan 16 2013, 20:18
Сообщение #9


Участник
*

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



окай я нашел эту строку...но как переназначить?
инициализацию чего и где вообще?)
я извиняюсь еще раз)сильно не бейте)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 16 2013, 20:19
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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 при том как? (проекта под авр под рукой у меня нет).
Go to the top of the page
 
+Quote Post
robototechnik
сообщение Jan 16 2013, 20:23
Сообщение #11


Участник
*

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



Артем я вас не понимаю(
что тип того?и при чем 1000Гц?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 16 2013, 20:27
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(robototechnik @ Jan 16 2013, 22:23) *
Артем я вас не понимаю(
что тип того?и при чем 1000Гц?


Вам какfя частота системного таймера нужна(она будет определять точность с которой выполняются задержки в частности)?
Go to the top of the page
 
+Quote Post
robototechnik
сообщение Jan 16 2013, 20:29
Сообщение #13


Участник
*

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



я точно не знаю...знаю что мне нужна неплохая точность угла поворота серводвигателя...а так же хорошее быстродействие системы для одновременного опроса сенсоров....вот)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 16 2013, 20:31
Сообщение #14


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(robototechnik @ Jan 16 2013, 23:18) *
окай я нашел эту строку...но как переназначить?
инициализацию чего и где вообще?)
я извиняюсь еще раз)сильно не бейте)

Ежели Вы уже писали под АВРки, то, надо полагать, в потрохах оных Вы уже разбираетесь? Тама три строчки в шесть рядов sm.gif Не морочьте людям голову на ночь sm.gif
Что у Вас свободно? 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
Go to the top of the page
 
+Quote Post
robototechnik
сообщение Jan 16 2013, 20:38
Сообщение #15


Участник
*

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



не то что бы много писал....так попробовал но думал что хоть немного разбираюсь(
забыл уточнить мне 15 лет)так что...пардон иногда недоезжаю)
теперь более менее понятно...то есть если я перекину тики на таймер0 то таймер1 освободится и смогу рулить сервами с моим кодом?верно?
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th June 2025 - 15:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016