STM32 CubeMx LL库-ADC操作
硬件选型
stm32f103c8t6
USB-TTL
关于STM32的ADC介绍这里有时间再补充,直接进入代码编写。
1. CubeMx-ADC配置
2. CubeMx-USART1配置
3. CubeMx-RCC配置
4. 代码
a)ADC初始化配置,后面需要自行添加相关代码
void MX_ADC1_Init(void)
{
/* USER CODE BEGIN ADC1_Init 0 */
/* USER CODE END ADC1_Init 0 */
LL_ADC_InitTypeDef ADC_InitStruct = {0};
LL_ADC_CommonInitTypeDef ADC_CommonInitStruct = {0};
LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Peripheral clock enable */
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
/**ADC1 GPIO Configuration
PB0 ------> ADC1_IN8
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_0;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN ADC1_Init 1 */
/* USER CODE END ADC1_Init 1 */
/** Common config
*/
ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
ADC_InitStruct.SequencersScanMode = LL_ADC_SEQ_SCAN_DISABLE;
LL_ADC_Init(ADC1, &ADC_InitStruct);
ADC_CommonInitStruct.Multimode = LL_ADC_MULTI_INDEPENDENT;
LL_ADC_CommonInit(__LL_ADC_COMMON_INSTANCE(ADC1), &ADC_CommonInitStruct);
ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE;
ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;
ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_CONTINUOUS;
ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE;
LL_ADC_REG_Init(ADC1, &ADC_REG_InitStruct);
/** Configure Regular Channel
*/
LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_8);
LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_8, LL_ADC_SAMPLINGTIME_239CYCLES_5);
/* USER CODE BEGIN ADC1_Init 2 */
/*以下代码不能自己生成,需要自行添加*/
// LL_ADC_EnableIT_EOS(ADC1); //使能ADC中断
LL_ADC_Enable(ADC1); //使能ADC
LL_ADC_StartCalibration(ADC1);//开始校准ADC1
while(LL_ADC_IsCalibrationOnGoing(ADC1)); //等待ADC校准完成
/* USER CODE END ADC1_Init 2 */
}
b)ADC初始化配置
/*设置ADC通道*/
float ADC1_GetVolValue(uint32_t ch)
{
uint16_t ADC_Value;
float ADC_VolValue;
LL_ADC_REG_SetSequencerRanks(ADC1,LL_ADC_REG_RANK_1,ch); //设置规则序列1,设置通道
LL_ADC_REG_StartConversionSWStart(ADC1); //启动规则转换通道
while(!LL_ADC_IsActiveFlag_EOS(ADC1)){};//等待转换结束
ADC_Value=LL_ADC_REG_ReadConversionData12(ADC1);
ADC_VolValue =(float)ADC_Value/4096*3.3;
return ADC_VolValue;
}
/*计算平均值*/
float ADC_GetAverage(uint8_t time)
{
uint8_t i;
float ADC_Sum, ADC_Average;
for(i=0;i<time;i++)
ADC_Sum=ADC_Sum+ADC1_GetVolValue(LL_ADC_CHANNEL_8);
ADC_Average=ADC_Sum/time;
return ADC_Average;
}
c) 串口代码
void Usart1Tran(uint8_t SendData)
{
while(!LL_USART_IsActiveFlag_TXE(USART1)); //防止数据帧第一个字节丢失
LL_USART_TransmitData8(USART1,SendData);
while(!LL_USART_IsActiveFlag_TC(USART1)); //等待发送完成
}
void Usart1TrN(uint8_t * SendData, uint8_t len)
{
uint8_t i;
for(i=0;i<len;i++)
{
Usart1Tran(SendData[i]);
}
}
d)主函数测试
while (1)
{
LL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
// ADC_VolValue=ADC1_GetVolValue(LL_ADC_CHANNEL_8);
ADC_Average=ADC_GetAverage(10);
// sprintf((char *)Tr,"The value is %.2f mV\r\n",ADC_VolValue*1000);
sprintf((char *)Tr,"%.2f\r\n",ADC_Average*1000);
Usart1TrN(Tr,25);
for(i=0;i<25;i++) //清空串口数据缓存
{
Tr[i]=0;
}
LL_mDelay(10);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
5. 测试结果展示
PB0悬空时,电压大约为1600mV,给引脚脉冲低电平,信号测试效果还可以。今天的STM32 CubeMx LL库关于ADC的展示就到这里啦!!!欢迎大家指正交流!!!
STM32 CubeMx LL库-ADC操作