嘉立创产业服务站群
站内搜索
发作品签到
专业版

电压电流表

工程标签

522
0
0
0

简介

这是使用STM32F103C8T6最小核心板做主控的电压电流表实验电路,旨在通过本次实验更好地掌握和了解ADC转换的原理及实用。

简介:这是使用STM32F103C8T6最小核心板做主控的电压电流表实验电路,旨在通过本次实验更好地掌握和了解ADC转换的原理及实用。
电压电流表训练营【立创开发板&CW32】

开源协议

GPL 3.0

创建时间:2024-07-29 23:57:13更新时间:2024-08-26 06:47:10

描述

   

本电压电流表实验电路是参照了立创开发板电压电流表训练营的官方电路,根据本人现有的元器件而设计完成的,这样就可以尽量减少费用支出,节约资源,防止浪费。本次实验的目的是为了更好地了解单片机的ADC原理,熟练掌握其使用方法,以便以后更好地应用。

  • 硬件设计

1主控电路:

主控开始采用STM32F103C8T6核心板,通过排针和排母与底板连接,可根据需要取下。程序的烧录则通过ST_LINK将核心板与电脑连接。STM32F103C8T6芯片是经典的单片机,各种应用的范例很容易在网上获得,调试过程中遇到问题也更容易得到帮助和解决,因此可以胜任本次实验。下图就是我现有的核心板:

这几块核心板是前几年购买元器件时顺带买的,因为当时核心板是包邮的,购买其它元器件时顺带买包邮商品可以节省邮费,所以我先后买过多块。

这类核心板我先后使用过多次,都没有发现问题。岂料这次使用这种17*2针的核心板却掉进了坑里:在调试ADC时无论如何都得不到预想的结果;调试串口通讯也遇到问题,无论如何调整速率都接收不到正确的数据;就连定时器都有问题,设置定时时间为1毫秒,实际时间却是1秒。花费了我近一周时间,最后我才排查到是核心板的问题,通过测试串口通讯和定时器得到了证实。临近评测结束,迫不得已我只好换上了另一块STM32L412KB开发板,总算在规定时间内勉强完成了评测任务。下图就是最后换用的开发板,由于时间紧迫,来不及重新打样PCB,只能将就着用杜邦线来连接开发板。

2、显示部分    

显示部分由两个0.56*3位的共阴极数码管组成,驱动电路采用了成熟的TM628芯片,这样配置可以减轻单片机的负担,大幅度减少程序调试的难度。这两个数码管也是存货,岂料其中的一个数码管的小数点有问题,不能显示,在调试过程中才发现,只好另购了数码管换上。

3、采样电路

采样电路基本上与官方提供的电路一致,简化了电压、电流标定部分。采样输入端口选用了两个间距5mm的接线端子,接线端子直接焊接在PCB板上,实验完成之后再考虑在外壳上设置接线柱,通过导线与PCB上的端子连接。

电压的采样电阻降压电路的阻值分别按300K/10K和20K/10K设计,ADC_V1设想为1/31倍率,测量电压约为0~100V;ADC_V2为1/3倍率,测量电压约为0~10V。

电流的采样电阻则选择了现成的10豪欧的康铜丝,这样检测的最大电流范围将比官方范例小很多。

4、供电电路

    本实验在官方的供电电路基础上增加了TypeC接口,这样除了可以通过标准的DC电源接口输入6~20v的直流电之外,还可以选择通过TypeC接口输入5v直流电,这样就可以通过USB接口从电脑或其它电器设备中获得电源,甚至还可以直接从充电宝获得电源,增加了本装置的使用方便性。

5、按键电路

    由于PCB板面积的限制,本实验装置仅安排了两个按键。对于本实验装置来说,两个按键已经够用了,万一不够的话还可以通过识别长短按键来解决。

6、电路图及PCB设计图

这是PCB设计图:

  • 软件设计及调试过程

1主函数

下面是main函数,基本框架和配置都是由CubeMX生成的,其中除了必要的ADC和DMA初始化外,UART2是通过开发板上的ST-LINK与上位机通讯的,TIM6是用于控制板载LED灯闪烁,其它启用的外设都是备用的。在开机流程中添加了板载LED灯的闪烁测试、TM1628的初始化和数码管的段码显示测试。在主循环中仅有检测按键及处理,获取ADC转换数据并将显示数据发送给TM1628驱动数码管等。下面是主函数的代码:

int main(void)

{

  /* USER CODE BEGIN 1 */

  uint8_t i;

  /* USER CODE END 1 */

 

  /* MCU Configuration--------------------------------------------------------*/

 

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();

 

  /* USER CODE BEGIN Init */

 

  /* USER CODE END Init */

 

  /* Configure the system clock */

  SystemClock_Config();

 

  /* USER CODE BEGIN SysInit */

 

  /* USER CODE END SysInit */

 

  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_DMA_Init();

  MX_USART1_UART_Init();

  MX_USART2_UART_Init();

  MX_ADC1_Init();

  MX_I2C1_Init();

  MX_TIM6_Init();

  /* USER CODE BEGIN 2 */

  for(i=0; i<10; i++){

    LED_G_Toggle();

    delay_ms(500);

  }

  LED_G_OFF();

       

  HAL_TIM_Base_Start_IT(&htim6);

  TM1628_Init();              

  /* USER CODE END 2 */

 

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  printf("ADC_Voltage+Ampere!\n");

 

HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);

HAL_ADC_Start_DMA(&hadc1,ADC_ConvertedValue,4);

  while (1)

  {

    if(0==HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)){

      while(0==HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)){

        Key_1++;

        delay_ms(10);

      }

    }

    if(Key_1>0)

      Key1Handler();

   

        printf("\nSTM32L412KB测试...\n");

    Get_ADC_Value();

    delay_ms(100);

    /* USER CODE END WHILE */

 

    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}

 

2ADC数据处理

由于在电路中添加了电压校准电路,我起初设想通过获取基准电压的ADC数值来计算出系数,然后通过这个系数来计算其它的ADC转化值,代码如下:

在测试过程中发现这样做会因为基准电压ADC转化过程中的误差造成其它的转化数据偏差,实测数据还不如常规的计算方法更稳定。下图是调试过程中的实测数据及图表:

其中红色和绿色的线条是用常规方法计算的电压值,蓝色和橙色的线条是采用基准电压系数计算的数值,可以直观地反映出两种计算结果的差异。

我的测试方式是利用可调DC电源从1.5V开始到17.5V,每隔0.5V记录下转换得到的V1和V2数值。从上图中可以看到,在被测电压低于10V时,V2的转换结果基本上的线性的,进入ADC引脚的电压没有超过单片机的工作电压。当被测电压达到10V及以上时,ADC的数据就不呈线性了,甚至还影响到单片机的串口通讯,上位机接收到的全是乱码。

在实验过程中还发现,电路中V2的降压比是1/3,ADC计算出的数据乘以3之后与实际电压值相差不大。但是按照V1的1/31降压比,ADC计算出的数据乘以31之后就与实际电压值相差甚远。从上表中可以看到,当实际被测电压为1.5V时,V1的分压是0.7V,降压比约为1/2。当被测电压为9V时,V1的分压是0.89V,降压比约为1/10。而当实测电压为17.5V时,V1的分压为1.28V,降压比约为1/13。离电路设计中的1/31相差甚远,而且这个降压比也不是固定的,随着被测电压的不断升高,降压比也在不断下降。之所以出现这个现象,估计是因为电路中没有设计电压跟随器,ADC采样输入对前面的分压产生了影响。建议在实用的电路中应该加上由运放构成的电压跟随器,以降低采样电路对分压电路的影响。

在本次实验中,我采用的是被测电压9.7V以下时选用V2的转换结果,高于9.7V时则采用V1的转换结果。

电流采样的电阻我选用的是现成的10毫欧采样电阻,因为没有加运算放大器,小于1A的电流很难检测到。加上时间紧迫,固本次实验未深入测试。

3TM1628驱动

在本电路中采用的是两个3位的数码管分别显示电压值和电流值,我是通过一个数组将6位要显示的内容及2个小数点位置传递到TM1628的驱动程序,由驱动程序将这些内容转换成数码管的字模并显示。

 

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
电压电流表实验报告.doc
43
2
STM32_L412_VOL.rar
51
3
视频链接.txt
14
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航