CW32数字电压电流表软件进阶教程-1.电压电流同时显示

描述

基于[CW32数字电压电流表软件教程-实验七:基本数据处理算法(均值滤波)],可以对电压电流进行同时采集显示。

CW32

电流检测电路如下:

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
     */  
}

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分