学习STM32编程——用中断方式实现智能小车电池电压的监测

(1) 2024-09-18 09:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
学习STM32编程——用中断方式实现智能小车电池电压的监测,希望能够帮助你!!!。

关键代码:

adc.c

void MyADC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 使能 GPIOA 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 使能 ADC1 时钟 /* 初始化 ADC 输入通道 GPIO */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PA5 通道 5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; // 模拟输入 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 不带上下拉 GPIO_Init(GPIOA, &GPIO_InitStructure); RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1 复位 RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); // 复位结束 /* 配置 ADC_CCR */ ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; // 独立模式 /* 两次采样之间的间隔时间为 5 个时钟周期 */ ADC_CommonInitStructure.ADC_TwoSamplingDelay =ADC_TwoSamplingDelay_5Cycles; /* 不使能 DMA */ ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; /* 分频系数 4 ADCCLK=PCLK2/4=84/4=21Mhz , ADC 时钟不要超过 36 MHz */ ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; ADC_CommonInit(&ADC_CommonInitStructure); /* 初始化 ADC 相关参数 */ ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //12 位模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 非扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 连续转换 /* 禁止外部触发检测,使用软件触发方式 */ ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐 ADC_InitStructure.ADC_NbrOfConversion = 1; // 启用 1 个转换通道 ADC_Init(ADC1, &ADC_InitStructure); //ADC 配置生效 ADC_Cmd(ADC1, ENABLE); // 使能 ADC ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE); ADC_NVIC_Config(); ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_480Cycles); ADC_SoftwareStartConv(ADC1); } /** * @brief ADC 中断优先级配置函数 * @param None * @return None */ void ADC_NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /** * @brief ADC 中断服务函数 * @param None * @return None */ void ADC_IRQHandler(void) { if (ADC_GetITStatus(ADC1,ADC_IT_EOC) == SET) { ADC_ConvertedValue = ADC_GetConversionValue(ADC1); } ADC_ClearITPendingBit(ADC1,ADC_IT_EOC); } 

main.c

int main(void) { delay_init(168); // 延时函数初始化 LED_Init(); //LED 端口初始化 USART1_Init(); //USART1 初始化 MyADC_Init(); //ADC 初始化 while(1) { adcVoltage = ADC_ConvertedValue * 3.3 / 4096*11; sprintf(myString," 采样值为: %d, 电压值为: %.2f V \r\n", \ ADC_ConvertedValue, adcVoltage); printf("%s",myString); delay_ms(2000); } }

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复