STM32F103C8T6 ADC采集电压
时间: 2023-09-16 13:12:42 浏览: 58
STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,它集成了一个12位的模数转换器(ADC),可以用于测量模拟信号的电压值。
在使用ADC采集电压前,需要进行以下配置:
1. 使能ADC模块时钟。可以通过设置RCC_APB2ENR寄存器的bit 9来实现:`RCC_APB2ENR |= (1 << 9);`
2. 配置ADC输入通道。可以通过设置ADC_CR2寄存器的bit 23-17来实现,例如,如果要采集PA0引脚的电压,则设置为:`ADC_CR2 |= (1 << 17);`
3. 配置ADC采样时间。可以通过设置ADC_SMPR2寄存器的相应位来实现,例如,如果要设置采样时间为28.5个时钟周期,则设置为:`ADC_SMPR2 |= (5 << 0);`
4. 启动ADC转换。可以通过设置ADC_CR2寄存器的bit 0来实现:`ADC_CR2 |= (1 << 0);`
5. 等待转换完成。可以通过查询ADC_SR寄存器的bit 1来检查转换是否完成:`while (!(ADC_SR & (1 << 1)));`
6. 读取转换结果。可以通过读取ADC_DR寄存器的低12位来获取转换结果:`uint16_t value = ADC_DR & 0xFFF;`
最后,将转换结果转换为电压值,可以使用以下公式:
`V = (value / 4095.0) * Vref`
其中,value是ADC转换结果,Vref是ADC参考电压,一般为3.3V。
相关问题
stm32f103c8t6adc采集电压
STM32F103C8T6 是一款 32 位微控制器,其具有内置的模数转换器 (ADC)。如果您想采集电压,您可以使用该微控制器的 ADC 功能进行采集。需要注意的是,在使用 ADC 采集电压之前,您需要进行一些配置,并且需要一些编程知识。
stm32f103c8t6adc采集电压代码
以下是使用STM32F103C8T6 ADC采集电压的代码示例:
首先,需要初始化ADC和GPIO。以下是使用CubeMX生成的代码:
```c
/* Configure ADC1 */
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/* Configure Regular Channel */
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* Configure GPIO */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
然后,使用以下代码开始ADC转换:
```c
HAL_ADC_Start(&hadc1);
```
等待转换完成:
```c
HAL_ADC_PollForConversion(&hadc1, 100);
```
获取转换结果:
```c
uint16_t adcValue = HAL_ADC_GetValue(&hadc1);
```
最后,将ADC值转换为电压:
```c
float voltage = (adcValue * 3.3) / 4096.0;
```
完整的代码示例:
```c
#include "main.h"
#include "stm32f1xx_hal.h"
ADC_HandleTypeDef hadc1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
uint16_t adcValue = HAL_ADC_GetValue(&hadc1);
float voltage = (adcValue * 3.3) / 4096.0;
// do something with voltage
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
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_0) != HAL_OK)
{
Error_Handler();
}
}
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
/* Configure ADC1 */
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/* Configure Regular Channel */
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/* Configure GPIO */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)