-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.c
executable file
·158 lines (125 loc) · 3.63 KB
/
main.c
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include "ch.h"
#include "hal.h"
#include <icu_lld.h>
#include <inttypes.h>
#include "chprintf.h"
#define KICKER_LOADED_VALUE 1500
#define KICKER_LOADING_SPEED 160
#define VOLTAGE_SENSOR_ANALOG_DRIVER &ADCD1
#define KICKER_PINS_GPIO GPIOA
#define LED_PIN 4
#define PHYSICAL_KICK_PIN 6
#define MASTER_READY_PIN 9
#define MASTER_KICK_PIN 10
#define KICKER_CONTROLL_PWM_DRIVER &PWMD3
#define KICKER_PWM_CONTROLL_PINS_GPIO GPIOB
#define PWM_CONTROLL_PIN 1
static const ADCConversionGroup loading_voltage_sensor = {
FALSE,
1,
NULL,
NULL,
ADC_CFGR1_RES_12BIT,
ADC_TR(0, 0),
ADC_SMPR_SMP_1P5,
ADC_CHSELR_CHSEL5
};
int16_t voltage_sensor_analog_read(void) {
adcsample_t sample;
adcConvert(VOLTAGE_SENSOR_ANALOG_DRIVER, &loading_voltage_sensor, &sample, 1);
return (int16_t)sample;
}
void i_am_ready_to_kick(void) {
palSetPad(KICKER_PINS_GPIO, MASTER_READY_PIN);
}
void i_am_not_ready_to_kick(void) {
palClearPad(KICKER_PINS_GPIO, MASTER_READY_PIN);
}
THD_WORKING_AREA(waKickerThread, 64);
THD_FUNCTION(KickerThread, arg) {
(void)arg;
palClearPad(GPIOA, 4);
while (1) {
if(voltage_sensor_analog_read() >= KICKER_LOADED_VALUE) {
i_am_ready_to_kick();
pwmEnableChannel(&PWMD3, 3, 0);
} else {
i_am_not_ready_to_kick();
pwmEnableChannel(&PWMD3, 3, KICKER_LOADING_SPEED);
}
chThdSleepMilliseconds(10);
}
chRegSetThreadName("kicker");
}
static PWMConfig kicker_loading_controll_pwmcfg = {
2000000,
200,
NULL, /* No callback */
{
{PWM_OUTPUT_ACTIVE_HIGH, NULL},
{PWM_OUTPUT_ACTIVE_HIGH, NULL},
{PWM_OUTPUT_ACTIVE_HIGH, NULL},
{PWM_OUTPUT_ACTIVE_HIGH, NULL}
},
0,
0
};
void led(uint8_t state) {
if(state) {
palSetPad(KICKER_PINS_GPIO, LED_PIN);
} else {
palClearPad(KICKER_PINS_GPIO, LED_PIN);
}
}
void init(void) {
halInit();
chSysInit();
/*
* ADC driver setup
*/
adcSTM32SetCCR(ADC_CCR_VBATEN | ADC_CCR_TSEN | ADC_CCR_VREFEN);
adcStart(VOLTAGE_SENSOR_ANALOG_DRIVER, NULL);
/*
* PWM driver setup
*/
pwmInit();
pwmStart(KICKER_CONTROLL_PWM_DRIVER, &kicker_loading_controll_pwmcfg);
/*
* Pins setup
*/
// PWM pin
palSetPadMode(KICKER_PWM_CONTROLL_PINS_GPIO, PWM_CONTROLL_PIN, PAL_MODE_ALTERNATE(1));
// Master communication pins
palSetPadMode(KICKER_PINS_GPIO, MASTER_READY_PIN, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(KICKER_PINS_GPIO, MASTER_KICK_PIN, PAL_MODE_INPUT_PULLDOWN);
// Physical kick
palSetPadMode(KICKER_PINS_GPIO, PHYSICAL_KICK_PIN, PAL_MODE_OUTPUT_PUSHPULL);
// LED pin
palSetPadMode(KICKER_PINS_GPIO, LED_PIN, PAL_MODE_OUTPUT_PUSHPULL);
/*
* default features configuration
*/
led(0);
i_am_not_ready_to_kick();
palClearPad(KICKER_PINS_GPIO, PHYSICAL_KICK_PIN);
/*
* Thread setup
*/
chThdCreateStatic(waKickerThread, sizeof(waKickerThread), NORMALPRIO, KickerThread, NULL);
}
void kick(void) {
palSetPad(KICKER_PINS_GPIO, LED_PIN);
palSetPad(KICKER_PINS_GPIO, PHYSICAL_KICK_PIN);
chThdSleepMilliseconds(500);
palClearPad(KICKER_PINS_GPIO, LED_PIN);
palClearPad(KICKER_PINS_GPIO, PHYSICAL_KICK_PIN);
}
int main(void) {
init();
while (true) {
if(palReadPad(KICKER_PINS_GPIO, MASTER_KICK_PIN)) {
kick();
}
chThdSleepMilliseconds(10);
}
}