模拟技术
温度传感器和VRENFINT通道框图
要使用传感器,请执行以下操作:
温度(单位为 °C)= {(V SENSE — V 25 ) / Avg_Slope} + 25
其中:
— V 25 = 25 °C 时的 V SENSE 值
— Avg_Slope = 温度与 V SENSE 曲线的平均斜率(以 mV/°C 或 μV/°C 表示)
由于ADC寄存器的相关配置相对比较简单,这里直接附上测量温度相关的ADC初始化和中断程序:
void ADC_Init() {u32prigroup =0;u32priority =0; RCC->APB2ENR |=1<<8;//开ADC1时钟ADC->CCR =0; ADC->CCR |=1<<23;//使能温度传感器和 V REFINT 通道ADC->CCR |=1<<16;//ADCCLK=21mHZADC1->CR1 =0;//分辨率12位ADC1->CR2 =0;//数据右对齐ADC1->CR2 |=1<<10;//通道只要转换结束,则将EOC置1,使能溢出检测ADC1->SMPR1 =0;//通道16采样时间3TADC1->SQR3 |=16<<0; ADC1->CR1 |=1<<5;//使能EOC中断ADC1->SR &=~ (1<<1);//清中断标记33prigroup = NVIC_GetPriorityGrouping();//得到优先级分组priority = NVIC_EncodePriority(prigroup,1,2);//优先级编码NVIC_SetPriority(ADC_IRQn,priority);//设置中断优先级NVIC_EnableIRQ(ADC_IRQn);//使能ADC中断ADC1->CR2 |=1<<0;//使能ADCDelay_us(3); ADC1->CR2 |=1<<30;//启动AD转换}u16ADC1_Value={0};//定义二维数组,按行存入三个通道的转换结束u8ADC1_OK =0;//中断处理函数void ADC_IRQHandler() {if(ADC1->SR & (1<<1)) { ADC1->SR &=~ (1<<1);//写0,请标记ADC1_Value = ADC1->DR;//按行依次存入各通道的转换结果ADC1_OK =1;//采集完成结束标记置1} }
接着编写主函数测试
#include"stm32f4xx.h"#include"usart.h"#include"delay.h"#include"stdio.h"#include"ADC.h"externu8 ADC1_OK;externu16 ADC1_Value;intmain(){floatwendu =0;NVIC_SetPriorityGrouping(7-2);Usart1_Init(115200);ADC_Init();while(1) {if(ADC1_OK ==1) { ADC1->SR &=~ (1<<1);//清中断标记ADC1_OK =0; wendu =3.3*ADC1_Value/4095;//求温度数字值对应的模拟电压值wendu = (wendu-0.76)*1000/2.5+25;//计算温度值printf("温度AD值:%d\\r\\nwendu = %.lf°C\\r\\n",ADC1_Value,wendu); ADC1->CR2 |=1<<0;//再次开启ADC1Delay_us(3); ADC1->CR2 |=1<<30;//触发一次转换}Delay_ms(1000); } }
从串口可以看到ADC读取的温度值,ADC温度测量成功。
对于电池电压或者其他外部模拟量的测量,配置方法与温度测量类似,这里不再赘述。如果想要让CPU更多地用于算法或者其他功能的处理,同样可以配置DMA进行数据传输。
全部0条评论
快来发表一下你的评论吧 !