基于[CW32数字电压电流表软件教程-实验七:基本数据处理算法(均值滤波)],可以对电压电流进行同时采集显示。
电流检测电路如下:
本项目设计的采样电流为3A,选择的采样电阻为100mΩ。AIN接入CW32芯片内部的AIN11通道,PB05端口上。
电流计算方法为(A为单位):AIN电压/0.1欧。
AIN电压计算方法与电压通道分压输入计算相同,V为单位时:
VIN=ADC转换值/4096*1.5V.
核心代码参考如下:
ADC初始化如下,完成两路AD转换通道初始化,使用序列扫描模式:
void ADC_init(void)
{
ADC_InitTypeDef ADC_InitStructure; //ADC配置结构体
ADC_SerialChTypeDef ADC_SerialChStructure; //ADC序列通道结构体
GPIO_InitTypeDef GPIO_Init_Struct;
__RCC_GPIOB_CLK_ENABLE(); //打开ADC对应引脚时钟
__RCC_ADC_CLK_ENABLE(); // 打开ADC时钟
GPIO_Init_Struct.IT = GPIO_IT_NONE;
GPIO_Init_Struct.Mode = GPIO_MODE_ANALOG;//将GPIO的模式配置成模拟功能
GPIO_Init_Struct.Pins = GPIO_PIN_1; // PB01是电压采集引脚
GPIO_Init(CW_GPIOB, &GPIO_Init_Struct);
PB01_ANALOG_ENABLE(); //使能模拟引脚
PB05_ANALOG_ENABLE();
ADC_StructInit(&ADC_InitStructure); // ADC默认值初始化
ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div4; //ADC工作时钟配置 PCLK/4 = 6/4 = 1.5Mhz
/*信号电压较低时,可以降低参考电压来提高分辨率。改变参考电压后,同样二进制表示的电压值就会不一样,
最大的二进制(全1)表示的就是你的参考电压,在计算实际电压时,就需要将参考电压考虑进去。*/
ADC_InitStructure.ADC_VrefSel = ADC_Vref_BGR1p5; //参考电压设置为1.5V
ADC_InitStructure.ADC_SampleTime = ADC_SampTime10Clk; //由于电压信号为慢速信号,ADC采样时间为十个ADC采样周期以确保准确
ADC_SerialChStructure.ADC_Sqr0Chmux = ADC_SqrCh9; //配置ADC序列,PB01是ADC的第9通道
ADC_SerialChStructure.ADC_Sqr1Chmux = ADC_SqrCh11;
ADC_SerialChStructure.ADC_SqrEns = ADC_SqrEns01;
ADC_SerialChStructure.ADC_InitStruct = ADC_InitStructure; //ADC初始化
ADC_SerialChContinuousModeCfg(&ADC_SerialChStructure); //ADC序列连续转换模式配置
ADC_ClearITPendingAll(); //清除ADC所有中断状态
ADC_Enable(); // ADC使能
ADC_SoftwareStartConvCmd(ENABLE); //ADC转换软件启动命令
数据采集处理代码如下:
void Volt_Cal(void)
{
ADC_GetSqr0Result(&sampledata); ///当前采集值显示出来
V_Buffer = (sampledata * ADC_REF_VALUE > > 12) * (R2 + R1)/R1;
// 四舍五入
if(V_Buffer % 10 >= 5)
{
V_Buffer = V_Buffer / 10 + 1;
}
else
{
V_Buffer = V_Buffer / 10;
}
ADC_GetSqr1Result(&I_Buffer); ///当前采集值显示出来
I_Buffer=I_Buffer * ADC_REF_VALUE > > 12;
/**
mv =I_Buffer * ADC_REF_VALUE > > 12,
R = 100mr,
10ma = mv/R/10=mv/0.1/10 = mv
*/
}
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !