main.c 8.32 KB
Newer Older
Charles Sirois's avatar
Charles Sirois committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
24
#include "can.h"
Charles Sirois's avatar
Charles Sirois committed
25
26
#include "dma.h"
#include "spi.h"
27
#include "tim.h"
Charles Sirois's avatar
Charles Sirois committed
28
29
30
31
32
33
34
35
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

#include "bsp_oled.h"
#include "bsp_usart.h"
36
37
38
39
40
41
42
43
44
#include "bsp_key.h"
#include "bsp_led.h"
#include "bsp_can.h"
#include "bsp_pwm.h"
#include "bsp_uart.h"


#include "pid.h"
#include "motor.h"
Charles Sirois's avatar
Charles Sirois committed
45
46
#include "oled.h"
#include "string.h"
47
#include "list_motor.h"
Charles Sirois's avatar
Charles Sirois committed
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
69
70
71
72
int16_t led_cnt;
float target_speed;
motor_t m2006;

73
extern RC_ctrl_t rc_ctrl;
74
75
76
77
//char buf[200];
//uint16_t pwm_pulse = 1080;  // default pwm pulse width:1080~1920


Charles Sirois's avatar
Charles Sirois committed
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

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_ADC1_Init();
  MX_SPI1_Init();
125
126
  MX_CAN1_Init();
  MX_TIM1_Init();
Charles Sirois's avatar
Charles Sirois committed
127
  /* USER CODE BEGIN 2 */
128
	HAL_GPIO_WritePin(GPIOH, POWER1_CTRL_Pin|POWER2_CTRL_Pin|POWER3_CTRL_Pin|POWER4_CTRL_Pin, GPIO_PIN_SET); // switch on 24v power
Charles Sirois's avatar
Charles Sirois committed
129
	
130
131
132
133
	/* open dbus uart receive it */
	dbus_uart_init();
	
	//Init OLED
Charles Sirois's avatar
Charles Sirois committed
134
135
136
137
138
139
	oled_init();
	oled_clear(Pen_Clear);
	oled_LOGO();
	oled_refresh_gram();
	
	HAL_GPIO_WritePin(LED_A_GPIO_Port, LED_A_Pin, GPIO_PIN_RESET);
140
	HAL_Delay(10);  
Charles Sirois's avatar
Charles Sirois committed
141
142
143
144
	
	oled_clear(Pen_Clear);
	oled_refresh_gram();
	
145
146
147
148
149
150
151
152
	
	can_user_init(&hcan1);                   // config can filter, start can
	pwm_init();                              // start pwm output
	motors_init();
	//PWM_ScaleAll(&htim1);									   // etalonnage du PWM entre 0 et 1 (a faire uniquement lors de l'installation des moteurs la 1ere fois) 
	

	
Charles Sirois's avatar
Charles Sirois committed
153
  /* USER CODE END 2 */
154
155
 
 
Charles Sirois's avatar
Charles Sirois committed
156
157
158
159
160
161

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188

    /* USER CODE BEGIN 3 */
				
		/* scan is key be pressed down to change target speed and pwm pulse */
    if (key_scan())
    {
			m3508_frontleft.target += 500;
			m3508_frontright.target += 500;
			m3508_backleft.target += 500;
			m3508_backright.target += 500;
			
			gm6020.target += 40;
			
      if (m3508_frontleft.target > 2000)
      {
				m3508_frontleft.target = 0;
				m3508_frontright.target = 0;
				m3508_backleft.target = 0;
				m3508_backright.target = 0;
				
				gm6020.target = 0;
      }
//			PWM_SetAllDuty(&htim1, 0.1f, 0.1f, 0.1f, 0.1f);
//			HAL_Delay(2500);
//			PWM_SetAllDuty(&htim1, 0, 0, 0, 0);
    }
		
189
190
191
192
		m3508_frontleft.target =  4*rc_ctrl.rc.ch[0] + 4*rc_ctrl.rc.ch[1];
		m3508_frontright.target = -(4*rc_ctrl.rc.ch[0] - 4*rc_ctrl.rc.ch[1]);
		m3508_backleft.target =   -(4*rc_ctrl.rc.ch[0] + 4*rc_ctrl.rc.ch[1]);
		m3508_backright.target =  4*rc_ctrl.rc.ch[0] - 4*rc_ctrl.rc.ch[1];
193
194
195
196
197
198
199
200
201
202

		get_motor_data(&m3508_frontleft);
		get_motor_data(&m3508_frontright);
		get_motor_data(&m3508_backleft);
		get_motor_data(&m3508_backright);
		
		get_motor_data(&gm6020);

		/*Affichage de donnees sur le OLED*/
//		oled_clear(Pen_Clear);
203
204
205
206
//		oled_printf(1, 1, "GM6020");
//		oled_printf(2, 1,"  Target: %f", gm6020.target);
//		oled_printf(3, 1,"  Speed: %i", gm6020.info.M3508_info.speed);
//		oled_printf(4, 1,"  Angle: %i", gm6020.info.M3508_info.angle);
207
//		oled_refresh_gram();
208
209
210
211
212
213
214
215

		oled_clear(Pen_Clear);
		oled_printf(0, 1, "Manette");
		oled_printf(1, 1,"  CH1: %i", rc_ctrl.rc.ch[0]);
		oled_printf(2, 1,"  CH2: %i", rc_ctrl.rc.ch[1]);
		oled_printf(3, 1,"  CH3: %i", rc_ctrl.rc.ch[2]);
		oled_printf(4, 1,"  CH4: %i", rc_ctrl.rc.ch[3]);
		oled_refresh_gram();
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
		
     /* led blink */
    led_cnt ++;
    if (led_cnt == 250)
    {
      led_cnt = 0;
      LED_RED_TOGGLE(); //blink cycle 500ms
    }
		
		set_motor_speed(&m3508_frontleft);
		set_motor_speed(&m3508_frontright);
		set_motor_speed(&m3508_backleft);
		set_motor_speed(&m3508_backright);
		
		set_motor_speed(&gm6020);

    set_motor_voltage(0, &m3508_frontleft, &m3508_frontright, &m3508_backleft, &m3508_backright); //0x200
		set_motor_voltage(1, &gm6020, NULL, NULL, NULL); //0x1ff
Charles Sirois's avatar
Charles Sirois committed
234
		
235
		HAL_Delay(10);	
Charles Sirois's avatar
Charles Sirois committed
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage 
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 6;
  RCC_OscInitStruct.PLL.PLLN = 168;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/