Skocz do zawartości
Kamilekkk

STM32F4 nadanie sygnału i jego odebranie

Pomocna odpowiedź

Dzień dobry,

 

Posiadam mikrokontroler STM32F429ZIT6. Potrzebuję wygenerować sygnał sinusoidalny o zadanej częstotliwości oraz amplitudzie na jednym z pinów, tak aby podłączony zewnętrzy układ (laser) zaświecił się. Jeżeli chodzi o kwestie elektroniki i jej programowania jestem całkowicie zielony. Staram się posiłkować kursem odnośnie STM32F4, który jest dostępny na forum, lecz niewiele mi to rozjaśnia. O ile dobrze rozumiem przy pomocy PWM jestem w stanie wygenerować sygnał, ale prostokątny. Czy jest jakaś możliwość, aby móc zrobić z niego sygnał sinusoidalny? A jeżeli nie, w jaki sposób mógłbym tego dokonać?

 

Druga sprawa, to taka, że potrzebuję odebrać sygnał (w tym przypadku zmierzyć napięcie) z zewnętrzengo czujnika, który również chcę podłączyć do któregoś z pinów. Tutaj powinienem skonfigurować odpowiedni pin na ADC zgadza się?

 

Bardzo prosiłbym o udzielenie pomocy, z góry dziękuję!

Udostępnij ten post


Link to post
Share on other sites
9 minut temu, Kamilekkk napisał:

O ile dobrze rozumiem przy pomocy PWM jestem w stanie wygenerować sygnał, ale prostokątny. Czy jest jakaś możliwość, aby móc zrobić z niego sygnał sinusoidalny?

Przy pomocy filtra dolnoprzepustowego ale po co, nie lepiej użyć przetwornika cyfrowo-analogowego?

 

10 minut temu, Kamilekkk napisał:

Druga sprawa, to taka, że potrzebuję odebrać sygnał (w tym przypadku zmierzyć napięcie) z zewnętrzengo czujnika, który również chcę podłączyć do któregoś z pinów. Tutaj powinienem skonfigurować odpowiedni pin na ADC zgadza się?

Oczywista oczywistość jak to powiedział jedne z klasyków.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
14 godzin temu, RFM napisał:

Przy pomocy filtra dolnoprzepustowego ale po co, nie lepiej użyć przetwornika cyfrowo-analogowego?

Rozumiem, że muszę skonfigurowac odpowiedni pin na DAC oraz ustawić zegar procesora tak, aby podał na ten pin sygnał o częstotliwości, którą ustawię? W jaki sposób mogę to zrobić? Syngnał, który chcę otrzymać na pinie skonfigurowanym pod DAC (PA4) to 5kHz (sinusoida). Posępując w ten sposób, że z panelu "pinout & configuration" odszukuję w zakładce "system core" RCC i ustawiam HSE na "crystal/ceramic resonator", później w panelu "clock configuration" zaznaczam opcję HSE przy "PLL source mux", a przy "system clock mux" zaznaczam PLLCLK" i ostatecznie w okienku pod HCLK wpisuje 0.005, ponieważ podaję tam w MHz, to wyskakuje że nie można w ten sposób - zostają zmienione ustawienia w tym palenu i najmniejsza częstotliwość, jaką mogę ustawić to 31.25kHz. 

Jeżeli coś napisałem niejasno, lub to co zrobiłem to totalne błądzenie - proszę o reprymendę

Bardzo proszę o pomoc, z góry dziękuję!

Edytowano przez Kamilekkk

Udostępnij ten post


Link to post
Share on other sites
14 minut temu, Kamilekkk napisał:

Rozumiem, że muszę skonfigurowac odpowiedni pin na DAC oraz ustawić zegar procesora tak, aby podał na ten pin sygnał o częstotliwości, którą ustawię?

Nie do końca.

Poczytaj o DDS. Potrzebujesz timera, który wyzwala transfer DMA. DMA wysyła próbki z RAM do DAC. To wszystko.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
Dnia 15.10.2019 o 14:00, RFM napisał:

Nie do końca.

Poczytaj o DDS. Potrzebujesz timera, który wyzwala transfer DMA. DMA wysyła próbki z RAM do DAC. To wszystko.

Cześć,

użycie DAC'a w tym przypadku upraszcza sprawę, ale możesz to także zrobić bez niego za pomocą PWM. Aby wygenerować sinusoidę o częstotliwości 5 KHz częstotliwość PWM musi być większa niż 10 KHz - wynika to z twierdzenia Kotielnikowa-Shannona zwanego też zamiennie twierdzeniem Nyquista-Shannona - patrz link:

https://pl.wikipedia.org/wiki/Twierdzenie_o_próbkowaniu

Uzyskanie przebiegu PWM o częstotliwości > 10 KHz (okres mniejszy niż 100 us) nie stanowi żadnego problemu na STM32F4. Zainstaluj sobie STM32CubeMX i następnie w nim zainstaluj pakiet "STM32Cube_FW_F4_V1.xx". Przejdź do katalogu z repozytorium CubeMX (katalog: C:\Users\TwojUser\Documents\STM32CubeMX)- wejdź do katalogu z nazwą zainstalowanego pakietu dla F4, potem \..Projects\STM32F411RE-Nucleo(lub inna plytka)\Examples_LL\TIM\TIM_PWMOutput. Tam będziesz miał przykładowy program jak wygenerować wymagany PWM (powiniem mieć co najmniej 8-bitów). Potem musisz stablicować wartości funkcji sinus z potrzebną Ci dokładnością (np. 256 próbek). Ostatnie co robisz to to wyrzucasz próbki z tablicy funkcji sinus w ten sposób, iż ustawiasz wartość PWM proporcjonalną do wartości funkcji sinus w tym punkcie. Na koniec dajesz prosty filtr dolnoprzepustowy[jak to już napisał kolega RFM] (np. na wzmacniaczach operacyjnych) i cieszysz się piękną sinusoidą. Oczywiście można to ulepszyć za pomocą DMA, ale i bez jego użycia da się to zrobić.

Pozdrawiam

Edytowano przez FlyingDutch
  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites
6 godzin temu, FlyingDutch napisał:

Oczywiście można to ulepszyć za pomocą DMA, ale i bez jego użycia da się to zrobić.

Po co męczyć CPU przerwaniami jak jest DMA?

Duża szybkość wykonywania programu na ARM nie wynika tylko z zegara i architektury ale także a często przede wszystkim ze sprzętu. Jak tylko się da, zadania powinno realizować DMA, które mało obciąża ("kradnie" cykle) CPU. W drugiej kolejności przerwania. naturalnie używamy sprzętu (i2C, SPI, itd) a nie programowych łat. Jak nie będzie się stosować do tych reguł, to "ubije" się nawet najszybszy CPU i a ARm zrobi się twór arduinopodobny. Tak samo wolny tyle, że z większym zegarem.

Udostępnij ten post


Link to post
Share on other sites
20 godzin temu, RFM napisał:

Po co męczyć CPU przerwaniami jak jest DMA?

Duża szybkość wykonywania programu na ARM nie wynika tylko z zegara i architektury ale także a często przede wszystkim ze sprzętu. Jak tylko się da, zadania powinno realizować DMA, które mało obciąża ("kradnie" cykle) CPU. W drugiej kolejności przerwania. naturalnie używamy sprzętu (i2C, SPI, itd) a nie programowych łat. Jak nie będzie się stosować do tych reguł, to "ubije" się nawet najszybszy CPU i a ARm zrobi się twór arduinopodobny. Tak samo wolny tyle, że z większym zegarem.

Cześć,

odwrócę pytanie: "Po co zatrudniać DMA jeśli CPU wystarczy?". Tu chodzi o sinusoidę o częstotliwości 5 KHz a nie 50 MHz. Widzę ES2, że "nawróciłeś" się na ARM'y. Szybko nadrabiasz zaległości - jeszcze niedawno twierdziłeś, że "RTOS" to system operacyjny przypominający Windows (chyba była o to mała kłótnia z Elvisem, jeśli mnie pamięć nie myli). Ale to cieszy, z większością twoich ostatnich postów (jako RFM) się zgadzam, ale w przypadku tego podałem alternatywne rozwiązanie. Zauważ, że kolega zadający pytanie jest początkujący, a użycie DMA komplikuje trochę program.

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites
2 minuty temu, FlyingDutch napisał:

kolega zadający pytanie jest początkujący, a użycie DMA komplikuje trochę program.

Tak, jak "rzeźbi" się na rejestrach nie (przeważnie nie) gdy używa się HAL.

 

3 minuty temu, FlyingDutch napisał:

jeszcze niedawno twierdziłeś, że "RTOS" to system operacyjny przypominający Windows

RTOS działa bardziej jak Linux, Linux to Unix, Unix to Amiga, na której napisałem (w zeszłym tysiącleciu, czyli niedawno) najwięcej softu (pomijając "traktory" 8051 i jego odmiany).

5 minut temu, FlyingDutch napisał:

Szybko nadrabiasz zaległości

Nie do końca.  Na ARM (LPC) pisałem  ok 2005 roku. Niestety, firma chce szybkich wyników, AVR znałem całkiem dobrze, LPC nie, debuger do LPC kiedyś tani nie był. Ten stan się utrzymywał dopóki nie pożegnałem się z firma w której pracowałem (przejście na STM miało być ale ... długo by pisać, nawet programatory i zestawy startowe były kupione).

Od czasu, gdy nikt nie mówi mi w jakich godzinach mam pracować i na jakich układach, zrealizowałem to, czego prze kilka lat pracy nie mogłem, definitywnie przeszedłem na ARM. Gdybym odszedł kilka lat wcześniej, to pewnie ekspertem od STM32 bym był. Teraz ograniczają mnie koszty. i często wymagania zleceniodawców.

Aby nie było, że tylko STM32, dowód: http://es2.noip.pl/rpi  może coś z tego wyjdzie? RPi ma wąskie gardło, do czego się nie zabiorę, to trzeba angażować USB i uC. Nicy to SPI, I2C działa ale.... FriendlyARM niby ok, ale tez do tego trzeba było dodac uC, bo owszem, można powalczyć z modyfikacją sterowników (tego nie potrafię) ale nowa wersja i ponowne walki ze sterownikami (chodzi o 9-bit USTART).

 

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
16 godzin temu, RFM napisał:

Linux to Unix

Co prawda w rozwinięciu rekurencyjny skrót oznacza "Linux is not Unix" (przynajmniej Torvalds tak uważał) ale być może coś wiesz lepiej od niego, natomiast

16 godzin temu, RFM napisał:

Unix to Amiga

to już ewidentna bzdura. AmigaOS (bo pewnie o nim myślisz pisząc "Amiga") był owszem wzorowany na Unixach, ale tylko wzorowany. Jeśli coś pisałeś to pewnie znasz biblioteki ixemul, może o nie Ci chodziło? Ale to też nie Unix, tylko emulacja bibliotek.

Owszem, można na tym było odpalić Linuxa, nawet ładnie chodził, ale jak już wspominałem - Linux is not Unix 🙂

 

Udostępnij ten post


Link to post
Share on other sites
14 minut temu, ethanak napisał:

to już ewidentna bzdura. AmigaOS (bo pewnie o nim myślisz pisząc "Amiga") był owszem wzorowany na Unixach, ale tylko wzorowany. Jeśli coś pisałeś to pewnie znasz biblioteki ixemul, może o nie Ci chodziło? Ale to też nie Unix, tylko emulacja bibliotek.

Owszem, można na tym było odpalić Linuxa, nawet ładnie chodził, ale jak już wspominałem - Linux is not Unix

Wiki nie jest wyrocznia ale akurat w tym przypadki nie ma błędu https://pl.wikipedia.org/wiki/Amiga

cytat z linku "Amiga 2000 była komputerem profesjonalnym, z dużymi możliwościami późniejszej rozbudowy. Oferowana była w kilku wariantach: Amiga 2500 (z procesorem MC68020 i dyskiem twardym), A2000HD (z dyskiem SCSI), A2000UX (działająca pod kontrolą systemu Unix, dokładniej SVR4)."

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

A widzisz... nawet o takim zwierzu nie słyszałem. Ciekawe!

Ale nawet istnienie wersji UX nie upoważnia do stwierdzenia że "Unix to Amiga". Szczególnie, że dotyczy to wyłącznie wersji 2000/3000.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@FlyingDutch bardzo dziękuję za pomoc oraz opisanie jasno co mogę zrobić by taką sinusoidę uzyskać! Na pewno w wolnej chwili skorzystam z rozwiązania, które mi podałeś! Na ten moment jednak mam inne pytanie - chcąc uzyskać syngał sinusoidalny o częstotliwości 5kHz posłużyłem się poradnikiem, który znalazłem na YT (link: watch?v=uIoAkbAtc2s). Niestety, w 4:25 kiedy Pan tłumaczy ustawienia timera zgubiłem się. W "Clock Configuration" na APB1 mamy 42MHz. W ustawieniach timera Pan z poradnika w "Prescaler" wspisuje 42-1 po czym mówi, że to minus 1 jest konieczne, ze względu, że oznacza ono dzielenie przez dwa. Koniec końców wspisuje 42-1 i mówi, że to będzie 42 podzielić przez 42 i wychodzi 1MHz. On tam dalej jeszcze zmienia "Counter Period" aby uzyskać ostatecznie 100kHz (czyli wpisuje 10-1). Ja "Counter Period" zostawiłem bez zmian (pozostawiłem zero) oczekując, że będę miał ten 1MHz na wjściu z tego względu, że dalej według poradnika moja częstotliwość będzie zależeć od liczby wartości w tablicy. Ja mam w swojej tablicy 256 wartości, a więc 1MHz = 1000000Hz. Czyli mając w tablicy 256 wartośći powinienem uzyskać częstotliwość sinusa mniej niż 4kHz. (Według poradnika dzielę to co mam na wyjściu przez liczbę elementów w tablicy). Po bezproblemowym skompilowaniu kodu, wgraniu na płytkę i podłączeniu do oscyloskopu, aby zobaczyć sygnał, nic nie byłem w stanie ujrzeć. Co pominąłem ważnego w tej kwestii? Mam nadzieję, ze wystarczająco jasno się wyraziłem, jeżeli nie proszę o reprymendę w razie wypadku, oraz o pomoc i wyjaśnienie co jest nie tak. Z góry dziękuję!

 

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
2 godziny temu, Kamilekkk napisał:

@FlyingDutch bardzo dziękuję za pomoc oraz opisanie jasno co mogę zrobić by taką sinusoidę uzyskać! Na pewno w wolnej chwili skorzystam z rozwiązania, które mi podałeś! Na ten moment jednak mam inne pytanie - chcąc uzyskać syngał sinusoidalny o częstotliwości 5kHz posłużyłem się poradnikiem, który znalazłem na YT (link: watch?v=uIoAkbAtc2s).

 

Cześć,

@Kamilekkk pod linkiem, który podałeś jest tutorial jak wygenerować sinusoidę z użyciem DAC i DMA. To kolega @RFM opisywał takie rozwiązanie, nie ja. Ja opisywałem rozwiązanie, gdy za pomocą tablicy funkcji sinus (te 256 wartości) modyfikujesz wartość PWM. W twoim typie mikro=kontrolera  możesz ustawić częstotliwość zegara na max. 180 MHz, czyli dużo więcej niż 1 Mhz.  Dołącz do twojego postu kod programu, bo bez niego to nie można powiedzieć nic konkretnego na temat twojego problemu

Pozdrawiam

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2019 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"

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

/* 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 ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;

DAC_HandleTypeDef hdac;
DMA_HandleTypeDef hdma_dac1;

TIM_HandleTypeDef htim6;

/* USER CODE BEGIN PV */

uint16_t PomiarADC;
float vsense;

/* 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);
static void MX_DAC_Init(void);
static void MX_TIM6_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

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

const uint8_t sineTable [256] = {
		  127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
		  242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,
		  221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,
		  76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,
		  33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124};

/* 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_ADC1_Init();
  MX_DAC_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */

  HAL_ADC_Start(&hadc1);
  const float supplyvoltage = 3.0;
  const float adcresolution = 4095.0;

  HAL_TIM_Base_Start(&htim6);

  HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)sineTable, 256, DAC_ALIGN_8B_R);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
	  {
		  PomiarADC = HAL_ADC_GetValue(&hadc1);
		  vsense = (supplyvoltage*PomiarADC)/adcresolution;

		  HAL_ADC_Start(&hadc1);
	  }

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* 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_SCALE3);
  /** 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 = 25;
  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_DIV4;

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

/**
  * @brief ADC1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */
  /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) 
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV8;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  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 = 1;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. 
  */
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}

/**
  * @brief DAC Initialization Function
  * @param None
  * @retval None
  */
static void MX_DAC_Init(void)
{

  /* USER CODE BEGIN DAC_Init 0 */

  /* USER CODE END DAC_Init 0 */

  DAC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN DAC_Init 1 */

  /* USER CODE END DAC_Init 1 */
  /** DAC Initialization 
  */
  hdac.Instance = DAC;
  if (HAL_DAC_Init(&hdac) != HAL_OK)
  {
    Error_Handler();
  }
  /** DAC channel OUT1 config 
  */
  sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;
  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN DAC_Init 2 */

  /* USER CODE END DAC_Init 2 */

}

/**
  * @brief TIM6 Initialization Function
  * @param None
  * @retval None
  */
static void MX_TIM6_Init(void)
{

  /* USER CODE BEGIN TIM6_Init 0 */

  /* USER CODE END TIM6_Init 0 */

  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM6_Init 1 */

  /* USER CODE END TIM6_Init 1 */
  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 42-1;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim6.Init.Period = 0;
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM6_Init 2 */

  /* USER CODE END TIM6_Init 2 */

}

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

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

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{

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

}

/* 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****/

@FlyingDutch oto kod mojego programu na podstawie poradnika z YT, do którego podałem wyżej link. Co do nadania tego sygnału to istotne jest to co znajduję się przy "User Code Begin 0" oraz "User Code Begin 2" (tutaj nie wszystko - niektore linie jak się pewnie domyślacie są od pomiaru napięcia.). Reszta jest od wspomnianego napięcia, do którego póki co nie mam pytań. Jak zwykle z góry dziękuję za pomoc!

Edytowano przez Kamilekkk

Udostępnij ten post


Link to post
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!

Gość
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...