[其他ST产品] STM32采集电流互感器(电流互感器模块)数据

[复制链接]
3818|18
 楼主| 家有两宝呀 发表于 2023-5-30 23:39 | 显示全部楼层 |阅读模式
1. 电流互感器简介
在发电、变电、输电、配电和用电的线路中电流大小悬殊,从几安到几万安都有。为便于测量、保护和控制需要转换为比较统一的电流,另外线路上的电压一般都比较高如直接测量是非常危险的。电流互感器就起到电流变换和电气隔离作用。

2. 电流互感器模块
电流互感器模块可以将交流电信号转换为电压信号,此时就能用stm32的ADC采集模块输出的AD信号。

(1)模块介绍
模块搭载ZMCT103c系列小型高精度电流互感器以及高精度运放电路,对信号做精确采样和适当补偿等功能。方便对5A以内的交流电进行信号采集。对应输出模拟交流信号可以调节,可根据电位器(调节放大比例,放大范围0-100倍)来调节所需输出电压,但是输出端(OUT)的最大电压不会超出1/2vCCo 34945647618b514521.png

(2)引脚说明


44607647618c28868c.png



 楼主| 家有两宝呀 发表于 2023-5-30 23:40 | 显示全部楼层
3. STM32采集电流互感器模块数据

此处需要注意的问题是在用STM32采集时如果无交流电通过线圈,STM32的AD接到OUT引脚相当于悬空状态,此时会AD会返回一个STM32悬空的AD值,所以在实际使用时需要在OUT和GND之间加一个下拉电阻:
84325647618e12fd9d.png
 楼主| 家有两宝呀 发表于 2023-5-30 23:41 | 显示全部楼层
ADC配置代码如下:
  1. #include "adc.h"
  2. #include "delay.h"
  3.                                                                                                                           
  4. void  Adc_Init(void)
  5. {        
  6.         ADC_InitTypeDef ADC_InitStructure;
  7.         GPIO_InitTypeDef GPIO_InitStructure;

  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );         
  9.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);  
  10.        
  11.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;               
  13.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  14.                      
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;               
  17.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  18.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  19.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;       
  20.         GPIO_Init(GPIOA, &GPIO_InitStructure);       

  21.         ADC_DeInit(ADC1);

  22.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;       
  23.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;       
  24.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;       
  25.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  26.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;       
  27.         ADC_InitStructure.ADC_NbrOfChannel = 1;       
  28.         ADC_Init(ADC1, &ADC_InitStructure);         
  29.         ADC_Cmd(ADC1, ENABLE);       
  30.        
  31.         ADC_ResetCalibration(ADC1);       
  32.          
  33.         while(ADC_GetResetCalibrationStatus(ADC1));       
  34.        
  35.         ADC_StartCalibration(ADC1);         

  36.         while(ADC_GetCalibrationStatus(ADC1));                

  37. }                                  

  38. u16 Get_Adc(u8 ch)   
  39. {
  40.   
  41.         ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );                                    
  42.   
  43.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);               
  44.          
  45.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));

  46.         return ADC_GetConversionValue(ADC1);       
  47. }

  48. u16 Get_Adc_Average(u8 ch,u8 times)
  49. {
  50.         u32 temp_val=0;
  51.         u8 t;
  52.         for(t=0;t<times;t++)
  53.         {
  54.                 temp_val+=Get_Adc(ch);
  55.                 delay_ms(5);
  56.         }
  57.         return temp_val/times;
  58. }          
 楼主| 家有两宝呀 发表于 2023-5-30 23:41 | 显示全部楼层
主函数采集通过串口发送数据到上位机:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"          
  5. #include "adc.h"
  6. #include "common.h"
  7. #include "usart2.h"
  8. #include "usart3.h"
  9. #include <string.h>

  10. u8 mp3_set1[7]={0xAA,0x07,0x02,0x00,0x06,0xB9};
  11. u8 mp3_set2[7]={0xAA,0x07,0x02,0x00,0x05,0xB8};

  12. int main(void)
  13. {         
  14.     u16 adcx;
  15.         u8 re = 0;
  16.          
  17.         delay_init();             
  18.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  19.         Adc_Init();        //ADC初始化                         
  20.         usart2_init(9600);//串口2初始化
  21.         delay_ms(200);

  22.         while(1)
  23.         {
  24.                         adcx=Get_Adc_Average(ADC_Channel_0,10);//ADC通道0采集电流互感器的输出值
  25.                         u2_printf("%d\r\n",adcx);//通过串口发送出去                       
  26.         }
  27. }
 楼主| 家有两宝呀 发表于 2023-5-30 23:41 | 显示全部楼层
实物图如下,用电风扇线作为测试,串口观察输出: 43786476194001827.png
 楼主| 家有两宝呀 发表于 2023-5-30 23:43 | 显示全部楼层
在风扇断电状态下输出为0: 46758647619a6d8eb6.png
 楼主| 家有两宝呀 发表于 2023-5-30 23:43 | 显示全部楼层
在电风扇开启状态下便可采集到电流互感器模块的输出: 58517647619b66811d.png
 楼主| 家有两宝呀 发表于 2023-5-30 23:43 | 显示全部楼层
代码工程链接:https://pan.baidu.com/s/1Pdcm7M7UqIl-YyeDvcFCSA
提取码:nigw
uiint 发表于 2023-6-8 07:30 | 显示全部楼层
在对电流进行采集时,需要考虑相关的系统噪声、温度漂移等因素,并结合具体应用场景进行相应的设置和调试。
uytyu 发表于 2023-6-8 14:50 | 显示全部楼层
根据实际应用需求,选择合适的电流变压器,并设置相应的变比和额定电流等参数。
maudlu 发表于 2023-6-8 15:09 | 显示全部楼层
片内集成的AD,好像都是单极性的
sdCAD 发表于 2023-6-8 16:44 | 显示全部楼层
启动ADC采样功能,将输出信号转换为数字信号,并存储到缓冲区中。
wwppd 发表于 2023-6-10 17:19 | 显示全部楼层
将电流变压器的输出连接到STM32芯片的模拟输入引脚上,并设置相应的ADC采样参数。
yorkbarney 发表于 2023-6-13 22:32 | 显示全部楼层
采集电流互感器的方法通常有两种:磁芯电流变压器(CT)和霍尔传感器。
uytyu 发表于 2023-6-14 15:23 | 显示全部楼层
如何实现接近开关传感器?               
minzisc 发表于 2023-6-14 16:11 | 显示全部楼层
根据电流变压器的变比和采样值,计算出最终电流值,并进行滤波和处理。
10299823 发表于 2023-6-19 09:25 | 显示全部楼层
需要根据实际要求选择合适的电流变压器和ADC精度等参数
claretttt 发表于 2023-6-19 10:20 | 显示全部楼层
stm32如何采集霍尔 传感器              
zhanghuichun 发表于 2024-4-26 09:37 | 显示全部楼层
采集交流电该怎么处理呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

585

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部