Давним давно прикупив собі відлагоджувальну плату STM32VL-Discovery. На ній встановлений мікроконтролер STM32F100RB, тактова частота до 24мГц.  Треба було запустити сервопривод (серву, сервомашинку). Одним словом вирішив на кінець розібратись, що із себе представляє даний мікроконтролер. По ходу того як буду розбиратись із переферією контролера, буду тут писати невеликі нотатки із робочого процесу. Це не навчальний курс, їх в інтернеті хватає із головою, а просто нотатки, щоб не забути, що я робив, якими я буду ділитись із вами.
TowerProMG995  Отже знадобилось запустити ось таку серву, куплену за пару баксів на ebay. Підключення здійснюється по трьох-проводному кабелю. Коричневий – GND, Червоний – +5V, Помаранчевий – Signal.
Принцип роботи дуже простий, на вхів Signal подається  PWM – імпульс із частотою 50Гц і періодом в 20 мсек, за допомогою регулювання скважності і здійснюється точне обертання ротора сервоприводу.

 

 

 

 

На діаграмі зображено яка має бути скважність, щоб обернути ротор серви на потрібний градус.
servo time puls

 

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "stm32f10x.h"
//Ці константи потрідно підбирати експерементально, за допомогою осцилографа
#define SERVO_180 8700
#define SERVO_0 3500
// Встановлює позицію вала в градусах
void set_pos(uint8_t pos) {
uint32_t tmp=(SERVO_180 - SERVO_0) /180 ;
TIM2->CCR2 = SERVO_0 + tmp * pos;
}
 
void TIMERS_init(){
 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM3->PSC = 23999; // f timer = fclk / 24000 => 1kHz
TIM3->ARR = 0xFFFF;
TIM3->CR1 = TIM_CR1_CEN; 
DBGMCU->CR = DBGMCU_CR_DBG_TIM3_STOP;
}
void delay_ms(uint16_t ms){
 
TIM3->ARR = ms;
TIM3->CNT = 0;
while((TIM3->SR & TIM_SR_UIF)==0){}
TIM3->SR &= ~TIM_SR_UIF;
}
 
int main()
{
TIMERS_init();
//Вмикаємо тактування порта А
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
//Вмикаємо тактування Таймера 2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
GPIO_InitTypeDef PORT;
// Налаштовуємо ногу (PA1)
PORT.GPIO_Pin = (GPIO_Pin_1);
//Вмикаємо альтернативний режим роботи GPIO
PORT.GPIO_Mode = GPIO_Mode_AF_PP;
PORT.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &PORT);
//Дозволяємо використовувати ногу PA1 для PWM
TIM2->CCER |= (TIM_CCER_CC2E);
TIM2->CCMR1|= (TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2);
//Налаштовуємо ділитиль на 50 Гц
TIM2->PSC = 6;
//Запускаємо таймер
TIM2->CR1 |= TIM_CR1_CEN;
uint8_t i;
//Начинаємо крутити сервою від 0 до 180 градусів і назад
while(1)
{
for(i=0; i<=180; i++)
{
set_pos(i);
delay_ms(3);
}
for(i=180; i>=1; i--)
{
set_pos(i);
delay_ms(3);
}
}
}

Код не мій, а знайдений в інтернеті, тільки злегка дописаний.

Проект в IAR: Servo

Comments:

Написати відповідь

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

вимагається