1 | #include "stm32f10x.h"
|
2 | #include "stm32f10x_tim.h"
|
3 | #include "stm32f10x_rcc.h"
|
4 | #include "stm32f10x_gpio.h"
|
5 |
|
6 | TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
|
7 | TIM_OCInitTypeDef TIM_OCInitStructure;
|
8 | GPIO_InitTypeDef GPIO_InitStructure;
|
9 |
|
10 | void servo_signal_init (void)
|
11 | {
|
12 |
|
13 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
|
14 |
|
15 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
|
16 |
|
17 | /* GPIO Configuration */
|
18 |
|
19 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_0 | GPIO_Pin_1;
|
20 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
21 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
22 | GPIO_Init(GPIOB, &GPIO_InitStructure);
|
23 |
|
24 | GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); // siehe Ref.Man Seite 116 unten
|
25 |
|
26 |
|
27 |
|
28 | //TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100
|
29 | //TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100
|
30 | //TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100
|
31 | //TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100
|
32 |
|
33 | /* Time base configuration */
|
34 | TIM_TimeBaseStructure.TIM_Period = 1000 - 1;
|
35 | TIM_TimeBaseStructure.TIM_Prescaler = 1-1;
|
36 | TIM_TimeBaseStructure.TIM_ClockDivision = 0;
|
37 | TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
|
38 |
|
39 | TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
|
40 |
|
41 |
|
42 | /* PWM1 Mode configuration: Channel1 */
|
43 | TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
|
44 | TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
|
45 | TIM_OCInitStructure.TIM_Pulse = 0;
|
46 | TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
|
47 |
|
48 | TIM_OC1Init(TIM3, &TIM_OCInitStructure);
|
49 |
|
50 | TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
|
51 |
|
52 | /* PWM1 Mode configuration: Channel2 */
|
53 | TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
|
54 | TIM_OCInitStructure.TIM_Pulse = 0;
|
55 |
|
56 | TIM_OC2Init(TIM3, &TIM_OCInitStructure);
|
57 |
|
58 | TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
|
59 |
|
60 | /* PWM1 Mode configuration: Channel3 */
|
61 | TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
|
62 | TIM_OCInitStructure.TIM_Pulse = 0;
|
63 |
|
64 | TIM_OC3Init(TIM3, &TIM_OCInitStructure);
|
65 |
|
66 | TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
|
67 |
|
68 | /* PWM1 Mode configuration: Channel4 */
|
69 | TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
|
70 | TIM_OCInitStructure.TIM_Pulse = 0;
|
71 |
|
72 | TIM_OC4Init(TIM3, &TIM_OCInitStructure);
|
73 |
|
74 | TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
|
75 |
|
76 | TIM_ARRPreloadConfig(TIM3, ENABLE);
|
77 |
|
78 |
|
79 | }
|
80 |
|
81 | void set_servo_signal (uint8_t servo,uint16_t ch)
|
82 | {
|
83 | switch (servo)
|
84 | {
|
85 | case 1:
|
86 | TIM3->CCR1 = ch;
|
87 | break;
|
88 |
|
89 | case 2:
|
90 | TIM3->CCR2 = ch;
|
91 | break;
|
92 |
|
93 | case 3:
|
94 | TIM3->CCR3 = ch;
|
95 | break;
|
96 |
|
97 | case 4:
|
98 | TIM3->CCR4 = ch;
|
99 | break;
|
100 | }
|
101 | }
|
102 |
|
103 | void on_off_servo_signal_timer(uint8_t on)
|
104 | {
|
105 | if (on)
|
106 | {
|
107 | TIM_Cmd(TIM3, ENABLE);
|
108 | }
|
109 | else
|
110 | {
|
111 | TIM_Cmd(TIM3, DISABLE);
|
112 | }
|
113 | }
|