STM32ADC
F042的ADC为12bitADC,采样所得到的值为0~(2^12)-1即0~4095,ADC引脚输入的最大电压为芯片的供电电压,若测量电压大于这一值,需要使用运算放大器进行转换。故该ADC是将0~3.3V分成了4096份进行比较采样。采样时间在cubemx设置为1.5Cycles。
因为只使用了ADC的一个引脚所以中断方式且判定ADC采样结束,其可以不使用DMA通道。
CUBEMX中ADC设置:
中断设置:
//定时器ARR溢出中断回调函数,以此达成周期性采样
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
HAL_ADC_Start_IT(&hadc);
}
//ADC采样完成中断回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* ADC_Handle){
HAL_ADC_Stop_IT(ADC_Handle);
HAL_TIM_Base_Stop_IT(&htim14);
ADC_val=HAL_ADC_GetValue(ADC_Handle); //ADC_Val为采样的ADC值
HAL_TIM_Base_Start_IT(&htim14);
}
//主函数while循环中的计算
voltage=ADC_val/4096.*3.3; //voltage为测量出的电压值
Matlab实时绘图
figure("Color",'w');
Port_List = serialportlist("available");
Device_serial = serialport("COM5",115200,"Timeout",5);
counter=1;
Device_serial.UserData=counter;
flush(Device_serial);
configureCallback(Device_serial,"byte",4,@SerialCallback);
%从串口每获取四字节触发回调函数SerialCallback
function SerialCallback(src,~)
data=read(src,4,"single");
plot(src.UserData,data,'.black');
%voltage=data/4096*3.3;
%plot(src.UserData,voltage,'.black');
%UserData为matlab UI共享存储,因为自Matlab2019后不能再使用全局变量global value
src.UserData=src.UserData+1;
hold on;
drawnow;
end