Skocz do zawartości

Kurs STM32 F4 - #5 - Pomiar napięcia (ADC), DMA, STMStudio


Pomocna odpowiedź

Akurat STMStudio działa w tym przypadku lepiej niż typowy debugger. Miałem kiedyś z DMA i ADC fajną przygodę - jak sprawdzałem wyniki pod debuggerem to dostawałem poprawną wartość, ale po wznowieniu działania programu wyniki były już ciągle takie jak za pierwszym razem. Ten sam problem dotyczy chyba tego odcinka kursu, ale nie dam głowy bo nie sprawdzałem.

Stąd pierwsze pytanie - jak za pomocą debuggera zatrzymasz program, to w zmiennych Pomiar_I, Pomiar_I1, Pomiar_I2 masz jakieś wyniki, czy same zera?

Edytowano przez Elvis
Link do komentarza
Share on other sites

1 godzinę temu, Treker napisał:

Pokaż cały program, bo wiele zależy od tego, w którym miejscu próbujesz wykonać te swoje instrukcje 😉

Co Masz na myśli pisząc w którym miejscu ?

51 minut temu, Elvis napisał:

Akurat STMStudio działa w tym przypadku lepiej niż typowy debugger. Miałem kiedyś z DMA i ADC fajną przygodę - jak sprawdzałem wyniki pod debuggerem to dostawałem poprawną wartość, ale po wznowieniu działania programu wyniki były już ciągle takie jak za pierwszym razem. Ten sam problem dotyczy chyba tego odcinka kursu, ale nie dam głowy bo nie sprawdzałem.

Stąd pierwsze pytanie - jak za pomocą debuggera zatrzymasz program, to w zmiennych Pomiar_I, Pomiar_I1, Pomiar_I2 masz jakieś wyniki, czy same zera?

Pod debuggerem mam wartości przypadkowe. Pomia_I - wartości z zakresu pomiarowego, natomiast w zmiennych Pomiar_I1 i I2 przpadkowe

Link do komentarza
Share on other sites

22 minuty temu, bresser2208 napisał:

Co Masz na myśli pisząc w którym miejscu ?

Nie mając programu przed oczami nie można było wykluczyć, że masz ten fragment kodu w jakiejś funkcji, której nigdy nie wykonujesz lub wykonujesz ją tylko raz po starcie programu. Nie takie kwiatki bywały już na forum 😉

Link do komentarza
Share on other sites


/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  ** This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether 
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * COPYRIGHT(c) 2018 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f3xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint16_t Pomiar_I[2];
uint16_t Pomiar_I1[1];
uint16_t Pomiar_I2[1];
uint16_t temp;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_ADC1_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
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_ADC1_Init();
  /* USER CODE BEGIN 2 */
  temp=10;
  HAL_ADC_Start_DMA(&hadc1,Pomiar_I, 2);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  temp=20;
  while (1)
  {

		temp=30;

  }
  /* USER CODE END 3 */

}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**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_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC1;
  PeriphClkInit.Adc1ClockSelection = RCC_ADC1PLLCLK_DIV1;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* ADC1 init function */
static void MX_ADC1_Init(void)
{

  ADC_ChannelConfTypeDef sConfig;

    /**Common config 
    */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 2;
  hadc1.Init.DMAContinuousRequests = ENABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure Regular Channel 
    */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.SamplingTime = ADC_SAMPLETIME_19CYCLES_5;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure Regular Channel 
    */
  sConfig.Channel = ADC_CHANNEL_2;
  sConfig.Rank = ADC_REGULAR_RANK_2;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/** 
  * Enable DMA controller clock
  */
static void MX_DMA_Init(void) 
{
  /* DMA controller clock enable */
  __HAL_RCC_DMA1_CLK_ENABLE();

  /* DMA interrupt init */
  /* DMA1_Channel1_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);

}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_RESET);

  /*Configure GPIO pins : PC0 PC1 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void _Error_Handler(char *file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
  }
  /* 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****/

Teraz zauważyłem, że program zatrzymuje się na wartości temp=10.
Czyli w ogóle nie dociera do pętli While

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dnia 28.10.2018 o 11:44, coolwilk napisał:

@Treker wszystko podpięte jest tak jak należy. Używałem tego samego modułu, podłączyłem go do tych samych pinów, nie pomyliłem wyprowadzeń (5v do 3v, gnd do gnd, vrx do pa1, vry do pa2, sw do pa3). Dodatkowo sprawdziłem to na innym stm32f411e i działa tak samo (użyłem także dwóch różnych Joystickow - wynik bez zmian)

 

Miałem ten sam problem ale wygląda na to, że te piny są zarezerwowane i nie można z nich skorzystać nie ustawiając wcześniej FUSE-ów. Ustaw w CUBE inne wejścia od ADC i zmień kanały w konfiguracji. Ja sprawdziłem i działa na PC0 i PC1 czyli IN10 i IN11.

  • Lubię! 1
Link do komentarza
Share on other sites

Cześć.

Mam problem z CubeMX. Robiłem zadania dodatkowe i wszystko szło dobrze, aż do momentu kiedy zacząłem robić zadanie trzecie "Jeżeli temperatura mikrokontrolera wzrośnie powyżej 30°, powinien włączyć się alarm. Jest on sygnalizowany miganiem wszystkich diod z częstotliwością 3Hz.".

Włączyłem "Temperature Sensor Channel" i ustawiłem jako rank 3 itd. Problem w tym, że po wygenerowaniu kodu program przestał się kompilować i wyrzuca błędy w dziwnych miejscach (widoczne na załączniku "wlasna_praca_domowa.PNG). Zacząłem zmieniać ustawienia i szukać błędu, przywrócić stan z poprzedniego zadania kiedy działało, ale nic nie pomogło. Pobrałem projekt CubeMX z kursu i już po wygenerowaniu kodu, bez żadnej ingerencji są błędy ("homework2.PNG"). Sam nie wiem jak się już za to zabrać. Może trzeba zmodyfikować ustawienia kompilatora w Open STM32 Eclipse?

Dzięki! 🙂

homework2.PNG - homework2.png

wlasna_praca_domowa.PNG - wlasna_praca_domowa.png

Edytowano przez MaciejZyskowski
  • Lubię! 1
Link do komentarza
Share on other sites

@MaciejZyskowski niestety mogą tu pojawiać się teraz takie problemy, bo jakiś czas temu była aktualizacja Cube, która sporo namieszała. W innej części tego kursu też był niedawno poruszany ten temat. Postaram się coś temu zaradzić, ale niestety dla nas też niektóre zmiany są zaskoczeniem 😕 Chyba najlepiej będzie jak wszyscy razem na forum spróbujemy wspólnymi siłami dojść do tego co dokładnie się zmieniło... Tak chyba będzie najszybciej.

  • Lubię! 1
Link do komentarza
Share on other sites

Czasem nie mogę się powstrzymać żeby nie napisać "a nie mówiłem" 😉

A tak serio - CubeMX dobrze spisuje się do szybkiego przygotowania szablonu aplikacji. Jak akurat działa i to co wygenerował również, to można się cieszyć, czym prędzej skasować CubeMX z dysku i dalej prowadzić projekt jak należy. Mam nadzieję że w tej pracy o której wspominasz tak będą z tego narzędzia korzystać - chociaż w sumie ich problem.

Link do komentarza
Share on other sites

Jasne, mi też niezbyt podoba się ten cały bałagan w kodzie oraz niepewność co CubeMX tam poustawiał, sam jeszcze nie jestem do niego przekonany. W pracy raczej nie mam przymusu z nim pracować, tzn. przekonam się niedługo. Najważniejsze, aby działało. ;d

Link do komentarza
Share on other sites

@MaciejZyskowski do zastosowań zawodowych chyba najlepsze jest jednak podejście przedstawione przez @Elvis, czyli takie, w którym wspomagasz się tylko tym GUI i później działasz jednak w kodzie sam. Już nie chodzi nawet o nasz kurs, ale o fakt tego, że nagle z dnia na dzień może przestać działać u Ciebie projekt generowany do pracy - to byłoby już bardzo słabe 😕

Link do komentarza
Share on other sites

Dnia 19.02.2018 o 22:24, MaStat napisał:

Witam,

Mam takim problem że STM Studio wyrzuca mi bardzo dziwne liczby pod zmiennymi które są stałe w miarę poruszania JoySticka(To samo z temperaturą). STM Studio wykrywa zmienne ale na to wygląda że przypisuje im bardzo dziwne wartości. Byłbym wdzięczny za jakąkolwiek pomoc w tej sprawie.

Pozdrawiam,
Statkiewicz

Witam,

Mam identyczny problem tzn. zmienne są wykryte przez stm studio ale przypisane wartości są z kosmosu do tego nie zmieniają się, czy udało się może komuś znaleźć rozwiązanie?

Link do komentarza
Share on other sites

Dzień dobry,

mam jedno pytanie, dlaczego zmienna SupplyVoltage ma przypisaną wartość 3.0 a nie 3.6, skoro z trzeciej części kursu wiemy, że mikrokontroler może być zasilany napięciem maksymalnym 3.6 V? Czy gdybym mierzył napięcie podawane na jeden z pinów mikrokontrolera z jakiegoś zewnętrzego źródła, ktory byłby 5V tolerant, to też powinienem przypisać takiej zmiennej wartość 3.0 czy jednak 5.0? Pytanie pewnie głupie, ale nie daje mi to spokoju, z góry dziękuję za odpowiedź!

Edytowano przez Kamilekkk
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.