Cześć,
Zbudowałem układ badający napięcie na celi baterii litowo jonowej. Zrobiłem to za pomocą wzmacniacza operacyjnego odejmującego i mikrokontrolera. Pierwszy wzmacniacz odejmuje a drugi jest jakby buforem, zrobiłem tak żeby pozbyć się problemu gdy bateria jest uszkodzona i na jednym styku mamy np 5.2V a na drugim 1V (nie chcialem zeby watosc roznicowa byla wieksza jak 3.3V).
Gdy przykladam miernik bezposrednio do drugiego wzmacniacza (bufora) to na wyjsciu mam zawsze 1.74V a gdy robie pomiar ADC to dostaje wyniki w zakresie od 0.8V - 2.2V i co pomiar losowo ta wartość z tego przedziału się zmienia. Co robię źle, że mikrokontorler nie pokazuje stalej wartości?
Dodam, że także mierze napięcie na potencjometrze i ono oscyluje w granicy 1.60-1.62V więc ADC na potencjometrze działa poprawnie.
Poniżej wstawiam kod programu a w zalaczniku schemat.
float adc_read(uint32_t channel) {
ADC_ChannelConfTypeDef adc_ch;
adc_ch.Channel = channel;
adc_ch.Rank = ADC_REGULAR_RANK_1;
adc_ch.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &adc_ch);
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
return HAL_ADC_GetValue(&hadc1);
}
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_ADC1_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1) {
/* USER CODE END WHILE */
HAL_GPIO_WritePin(led1_GPIO_Port, led1_Pin, GPIO_PIN_SET);
HAL_Delay(1000);
cela1 = adc_read(ADC_CHANNEL_1);
cela11 = cela1 * 3.3 / 4096.0;
HAL_Delay(200);
potencjometr = adc_read(ADC_CHANNEL_7);
potencjometr1 = potencjometr * 3.3 / 4096.0;
HAL_Delay(200);
HAL_GPIO_WritePin(led1_GPIO_Port, led1_Pin, GPIO_PIN_RESET);
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
Zbudowałem układ badający napięcie na celi baterii litowo jonowej. Zrobiłem to za pomocą wzmacniacza operacyjnego odejmującego i mikrokontrolera. Pierwszy wzmacniacz odejmuje a drugi jest jakby buforem, zrobiłem tak żeby pozbyć się problemu gdy bateria jest uszkodzona i na jednym styku mamy np 5.2V a na drugim 1V (nie chcialem zeby watosc roznicowa byla wieksza jak 3.3V).
Gdy przykladam miernik bezposrednio do drugiego wzmacniacza (bufora) to na wyjsciu mam zawsze 1.74V a gdy robie pomiar ADC to dostaje wyniki w zakresie od 0.8V - 2.2V i co pomiar losowo ta wartość z tego przedziału się zmienia. Co robię źle, że mikrokontorler nie pokazuje stalej wartości?
Dodam, że także mierze napięcie na potencjometrze i ono oscyluje w granicy 1.60-1.62V więc ADC na potencjometrze działa poprawnie.
Poniżej wstawiam kod programu a w zalaczniku schemat.
float adc_read(uint32_t channel) {
ADC_ChannelConfTypeDef adc_ch;
adc_ch.Channel = channel;
adc_ch.Rank = ADC_REGULAR_RANK_1;
adc_ch.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &adc_ch);
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
return HAL_ADC_GetValue(&hadc1);
}
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_ADC1_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1) {
/* USER CODE END WHILE */
HAL_GPIO_WritePin(led1_GPIO_Port, led1_Pin, GPIO_PIN_SET);
HAL_Delay(1000);
cela1 = adc_read(ADC_CHANNEL_1);
cela11 = cela1 * 3.3 / 4096.0;
HAL_Delay(200);
potencjometr = adc_read(ADC_CHANNEL_7);
potencjometr1 = potencjometr * 3.3 / 4096.0;
HAL_Delay(200);
HAL_GPIO_WritePin(led1_GPIO_Port, led1_Pin, GPIO_PIN_RESET);
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}