We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hello,
I am newbie in embedded world, but until now I could solve my problems just with searching on internet. Now I cannot solve this problem and this is my first question in this forum. I can write here something very absurd, please ignore them. I will try to do my best to explain my problem.
For this project I am using stm32F407vgt6 MCU, Cubemx (v 5.6.1) , Keilµvision (v 5.29.0.0). (Cubemx pinout will be uploaded as Picture)
I have builded a 4 leg spider with 12 servos with timer 2,3 and timer 4. I am commanding my robot via Bluetooth module(hc-05). Now it can walk and turn right left.
I want to open a interrupt channel (PC13) which is connected to a sensor .
What I want to do;
If I insert a metall dedector to Interrupt channel and robot meets with an metal, I want that robot stops and turn another direction and continue to walk. (Or we can think that when it comes against a wall, infrared sensor will be activated and robot stops and walk another direction). I did not use a analog sensor, instead I have connected with a digital sensor and read the sensor as it is button. I am not working on ADC mode.
I have applied all what I want and start the test.
Attempt 1:
Firstly I wrote just the stand position code in Interrupt function without a delay code as it has seen followingly.
/* USER CODE BEGIN 4 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){/* Prevent unused argument(s) compilation warning */UNUSED(GPIO_Pin);/* NOTE: This function Should not be modified, when the callback is needed,the HAL_GPIO_EXTI_Callback could be implemented in the user file*/
htim2.Instance->CCR1 = 185;htim2.Instance->CCR2 = 115;htim2.Instance->CCR3 = 110;htim2.Instance->CCR4 = 180;htim3.Instance->CCR1 = 125;htim3.Instance->CCR2 = 185;htim3.Instance->CCR3 = 180;htim3.Instance->CCR4 = 115;
htim4.Instance->CCR1 = 125;htim4.Instance->CCR2 = 180;htim4.Instance->CCR3 = 190;htim4.Instance->CCR4 = 125;}/* USER CODE END 4 */
Result: The robot stops just a second in stand position and continue to walk suddenly.
Attemp 2: I have thought without a delay function interrupt does not take much time and continue to walk, and wrote turn right code which has too much delay in it.
/* USER CODE BEGIN 4 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ /* Prevent unused argument(s) compilation warning */ UNUSED(GPIO_Pin); /* NOTE: This function Should not be modified, when the callback is needed, the HAL_GPIO_EXTI_Callback could be implemented in the user file */ //2. Leg htim3.Instance->CCR2 = 190; HAL_Delay(40); htim3.Instance->CCR2 = 210; HAL_Delay(100); htim2.Instance->CCR2 = 110; HAL_Delay(40); htim2.Instance->CCR2 = 166; HAL_Delay(100); htim3.Instance->CCR2 = 205; HAL_Delay(40); htim3.Instance->CCR2 = 185; HAL_Delay(100);
etc...}/* USER CODE END 4 */
Result: If there is a delay code in user code 4, it makes always this result. When interrupt chn is activated, the robot stops moving and take no more command until I reset the MCU.
and later I tried so many other possibilities, but it did not work. (writing the all codes in interrupt function | in while section creating a interrupt button and "if(interruptState){}" etc.)
I kindly need your helps.
What should I do to overcome this problem?
My codes are very very long so I can not write down here but I will give short and important examples of my code at the end of this post.
/* USER CODE BEGIN PV */
char rxMessage[1];
/* USER CODE END PV */
-----------------
/* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2)
etc...
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4); /* USER CODE END 2 */
while (1) { /* USER CODE END WHILE */
/* USER CODE BEGIN 3 */ if(HAL_UART_Receive(&huart1,(uint8_t *)rxMessage,sizeof(rxMessage),HAL_MAX_DELAY)!=HAL_OK){ Error_Handler(); } if(strncmp(rxMessage,"n",1)==0){
htim2.Instance->CCR1 = 185; htim2.Instance->CCR2 = 115; htim2.Instance->CCR3 = 110; htim2.Instance->CCR4 = 180; htim3.Instance->CCR1 = 125; htim3.Instance->CCR2 = 185; htim3.Instance->CCR3 = 180; htim3.Instance->CCR4 = 115;
htim4.Instance->CCR1 = 125; htim4.Instance->CCR2 = 180; htim4.Instance->CCR3 = 190; htim4.Instance->CCR4 = 125;
} (This stand and start position of the robot)
Walking
if(strncmp(rxMessage,"i",1)==0){ //Left-Front leg htim3.Instance->CCR2 = 190; HAL_Delay(40); htim3.Instance->CCR2 = 205; HAL_Delay(100); htim2.Instance->CCR2 = 113; htim4.Instance->CCR2 = 176;HAL_Delay(40); htim2.Instance->CCR2 = 85; htim4.Instance->CCR2 = 150; HAL_Delay(100); htim3.Instance->CCR2 = 200; HAL_Delay(40); htim3.Instance->CCR2 = 178; HAL_Delay(100);
etc...}
/* USER CODE BEGIN 4 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ /* Prevent unused argument(s) compilation warning */ UNUSED(GPIO_Pin); /* NOTE: This function Should not be modified, when the callback is needed, the HAL_GPIO_EXTI_Callback could be implemented in the user file */ }/* USER CODE END 4 */