Skocz do zawartości

ADC STM32F103VB pomiar prądu i napięcia


Pomocna odpowiedź

Witam wszystkich, od jakiegoś czasu moderuje sie z problemem pomiaru prądu oraz rezystancji /oporu. Mianowicie mam płytkę KAMAMI ZL27ARM i na niej mam ustawiony pomiar synchroniczny dwoch kanałów PC4 PC3 do PC4 jest podpięty potencjometr 10k i opornik 1k (dzielnik napięcia). W moim załozeniu miało wyglądac to tak ze na tych dwoch kanałach mierze prąd napięcie no i opór oraz wyśw na wyśw LCD 2x16. O ile napięcie jest mierzone to juz dalej idąc w las jest coraz gorzej. Prąd juz pokazuje 0 a jak prad zero to i opór też. Wysyłam kod programu 


/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd_hd44780_lib.h"
/* 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 */

/* 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)
{
  int VCC = 3300; // mV

  /* USER CODE BEGIN 1 */
  long int wartoscADC1 = 0;
  long int wartoscADC1V = 0;
  char wartoscADC1VTekst[10] = {"0"};

  long int wartoscADC2 = 0;
  long int wartoscADC2V = 0;
  char wartoscADC2VTekst[10] = {"0"};


  int R = 0; // rezystancja
  int I = 0; // prad
  int U; //napiecie
  int bufor[10] = {};


  int R2 = 0; // rezystancja
  int I2 = 0; // prad
  int U2; //napiecie
 // int bufor2[10] = {};

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

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  LCD_Initialize();                       //inicjalizacja wyswietlacza
  LCD_WriteCommand(HD44780_CLEAR);        //wyczysc wyswietlacz
 /* LCD_WriteTextXY("ADC1:  0,000 V",0,0);
  LCD_WriteTextXY("ADC2:  0,000 V",0,1);
*/

  HAL_ADC_Stop(&hadc1);
  HAL_ADCEx_Calibration_Start(&hadc1);
  HAL_ADC_Stop(&hadc2);
  HAL_ADCEx_Calibration_Start(&hadc2);

  //Wyzwolenie pomiaru, koleje beada wyzwalane automatycznie
  HAL_ADC_Start(&hadc2);
  HAL_ADC_Start(&hadc1);

  while (1)
  {
   //Odczekanie na zakonczenie konwersji
	  //Odczekanie na zakonczenie konwersji
	     while (HAL_ADC_PollForConversion(&hadc1,1)!=HAL_OK);
	     while (HAL_ADC_PollForConversion(&hadc2,1)!=HAL_OK);

	     //Przeliczenie wartosci wyrazonej jako calkowita, 12-bit na rzeczywista
	     //Odczytana wartosc nalezy przemnozyc przez 0.8059
	     wartoscADC1 = HAL_ADC_GetValue(&hadc1);
	     wartoscADC1V = wartoscADC1 * 8059/10000;

	     wartoscADC2 = HAL_ADC_GetValue(&hadc2);
	   //  wartoscADC2V = wartoscADC2 * 8059/10000;


	     U2 = (wartoscADC2 * 8059)/10000;
	     I2 = ((VCC-U2)/1000); // (VCC-Ux(ADC))/R1=1000 ma byc w mikroA*
	     R2= (U2*1000)/(I2*1000);



	     //Przeksztalcenie wyniku na tekst, dzielenie calkowite wyznacza wartosc w V,
	     //dzielenie modulo - czesc po przecinku
	     sprintf(wartoscADC1VTekst, "%ld", U2);
	     LCD_WriteTextXY(wartoscADC1VTekst, 7, 0);
	     sprintf(wartoscADC2VTekst, "%ld", I2);
	     LCD_WriteTextXY(wartoscADC2VTekst, 7, 1);

	      // Aktualizacja wyswietlacza co okolo 0.25s
	      HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_15);//LED8
	      HAL_Delay(500);


    /* 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};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the CPU, AHB and APB busses clocks
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL7;
  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_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV4;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != 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****/

Jakośc tego porgramu kodu jest tragiczna, bo juz byl z 100 razy przerabiany a po za tym dopiero się uczę tego wszytskiego :). W skrócie potrzbuje mierzyć 3 te wartosci R U I.

Link to post
Share on other sites

Narysuj jednak jakiś schemat. Ciekawi jesteśmy jak chcesz mierzyć te wielkości i jaki układ do tego wymyśliłeś. Opisz także dokładnie metody jakie chcesz zastosować do pomiarów tj. jakie napięcia mierzysz (bo tylko to możesz robić) i co z nich ma wynikać. Podeprzyj to wzorami.

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!

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.