找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15753|回复: 35
收起左侧

STM32单片机智能电表交流电压电流程序设计(电流 电压互感器TV1005M+TA1005M)

  [复制链接]
ID:355082 发表于 2019-4-15 15:50 | 显示全部楼层 |阅读模式
5、基于STM32F103单片机智能电表交流电压电流设计
本设计由STM32单片机核心板电路+交流电压电流检测模块电路+WIFI模块电路+指示灯电路组成。
1、通过电压互感器TV1005M和电流互感器TA1005M分别检测交流电压和交流电流值,
2、手机APP和WiFi模块互联后,可以实时显示交流电压、交流电流、功率和电量实时显示在手机上。
3、当功率超过200W时,继电器自动断开。功率不超过200W时,可以手动控制继电器的开关。
4、手机和WiFi模块连接后,手机上显示计时时间。
stm32-5 (1).JPG stm32-5 (3).JPG stm32-5 (5).JPG

名称:AUAISOUT000
IP及端口号:10.10.10.11:8080

接受内容:
V:123A:12345P:1234567Q:1234567.89T:123R:1

说明:(只增加R部分命令及发送内容,其他未变动)   
V:123        表示123V交流电压    字符5个长度不变 如12V 表示V:012
A:12345        表示12.345A交流电流     
P:1234567    表示1234.567W 瞬时功率 即缩小1000倍   
Q:1234567.89    表示1.23456789    度 缩小1000000倍 因为度的单位比较大kwh
T:1234        表示1234S 单片机设备运行时间
R:1        表示继电器接通 供电中 0表示断开即过载

发送内容:*或者#     #断开供电    *接通供电

元件清单:
极性电容    10uF
电阻    1K
STM32核心板    STM32_CORE
交流电压电流检测模块    交流电压电流检测
ESP8266/WIFI模块    WIFI_ESP8266
220V公头线    2芯公头
220V母头线    2芯母头
2.54单排座    3pin
2.54单排座    4pin
2.54单排座    5pin
2.54单排座    20pin
覆铜板或万用板    /
普通USB线_大头    /
导线(只万用板有)    /
焊锡    /

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "lcd.h"
  6. #include "adc.h"
  7. #include <stdio.h>
  8. #include "timer.h"

  9. //char tabDataV[5];//打印电压数组
  10. //char tabDataA[7];//打印电流数组
  11. //char tabDataP[9];//打印功率数组
  12. //char tabDataQ[12];//打印电量数组
  13. //char tabDataT[6];//打印时间数组
  14. char tabData[42];//打印时间数组

  15. unsigned int ACcurrent;                //市电电流
  16. unsigned int ACvolt;                //市电电压
  17. unsigned long PowerWt=0;//功率
  18. float PowerQd=0;//功率
  19. unsigned char relayFlag=1;
  20. int main(void)
  21. {
  22.         u16 adcx;
  23.         float temp;
  24.         delay_init();                     //延时函数初始化         
  25.         uart_init(9600);                 //串口初始化为115200
  26.   TIM3_Int_Init(499,7199);//50ms           
  27.         LED_Init();                                  //初始化与LED连接的硬件接口
  28.   LED0=0;
  29.          Adc_Init();                                  //ADC初始化            

  30.         RELAY=1; //继电器打开
  31.         relayFlag=1;        //继电器状态标识
  32.         delay_ms(4000);
  33.         
  34.         printf("AT+CIPMUX=1\r\n");                   //允许链接
  35.         delay_ms(1000);
  36.         printf("AT+CIPSERVER=1,8080\r\n");           //创建端口号8080
  37.         delay_ms(1000);
  38.         while(1)
  39.         {
  40.                 adcx=Get_Adc_Average(ADC_Channel_1,10);// PA1 交流电压检测口 ad转换10次求平均值
  41.                 temp=(float)adcx*(3.3/4096);
  42.                 ACvolt=(unsigned int)(temp*303);//*303 互感器计算获取 以及1K电阻 用示波器检测校准得到
  43.                 if(ACvolt<15) ACvolt=0;
  44.                
  45.                 adcx=Get_Adc_Average(ADC_Channel_2,10);        // PA2                                                       求平均值
  46.                 temp=(float)adcx*(3.3/4096);
  47.                 if(temp>0.02)
  48.                 {
  49.                         ACcurrent=(unsigned int)((temp-0.02)*3100);//*3950 互感器计算获取扩大1000倍 以及1K电阻 用示波器检测校准得到 0.02去除波动 防止误判断
  50.                 }
  51.                 else
  52.                 {
  53.                                 ACcurrent=0;
  54.                 }
  55.                 if(ACcurrent<50)ACcurrent=0;//滤除电流
  56.                 PowerWt=ACvolt*ACcurrent;                 //功率
  57.                
  58.                 if(dealFlag==1)//处理标志
  59.                 {
  60.                         dealFlag=0;
  61.                         PowerQd=(float)PowerWt*1/60.0/60.0+PowerQd;        //累计电量 1表示1s 因为电流扩大了1000倍 因此该处也扩大了1000倍 且此处功率单位为W 除以1000为千瓦 结果为度 1度=1千瓦时
  62.                 }
  63.                
  64.                 if(times>=9999)
  65.                 {times=0;}
  66.                
  67.                 if(PowerWt/1000>200)
  68.                 {        
  69.                         RELAY=0;                        //关闭继电器
  70.                         relayFlag=0;
  71.                 }               

  72.                 sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:1",ACvolt,ACcurrent,PowerWt,PowerQd,times);               
  73. //                sprintf(tabDataA,"A:%05d",ACcurrent);//电流
  74. //                sprintf(tabDataP,"P:%07lu",PowerWt);//功率
  75. //                sprintf(tabDataQ,"Q:%010.2f",PowerQd);//电量                        
  76. //                sprintf(tabDataT,"T:%04d",times);//时间
  77.                 if(relayFlag==1)
  78.                 {sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:1",ACvolt,ACcurrent,PowerWt,PowerQd,times);                }//打印数据
  79.                 else
  80.                 {sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:0",ACvolt,ACcurrent,PowerWt,PowerQd,times);                }//打印数据
  81.         
  82.                
  83.                 printf("AT+CIPSEND=0,42\r\n");                //发送固定字节数据的at命令
  84.                 delay_ms(200);
  85.                 printf(tabData);                                        //发送数据
  86.                 delay_ms(200);

  87.                 LED0=!LED0;                //数据发送        
  88.                 delay_ms(200);                //延时
  89.         }                                                                                            
  90. }        
复制代码
  1. #include "adc.h"
  2. #include "delay.h"
  3.    
  4.                   
  5. //初始化ADC
  6. //这里我们仅以规则通道为例
  7. //我们默认将开启通道0~3                                                                                                                                          
  8. void  Adc_Init(void)
  9. {         
  10.         ADC_InitTypeDef ADC_InitStructure;
  11.         GPIO_InitTypeDef GPIO_InitStructure;

  12.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //使能ADC1通道时钟


  13.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

  14.         //PA1 作为模拟通道输入引脚                        
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
  17.         GPIO_Init(GPIOA, &GPIO_InitStructure);        

  18.         ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

  19.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
  20.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //模数转换工作在单通道模式
  21.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模数转换工作在单次转换模式
  22.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动
  23.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
  24.         ADC_InitStructure.ADC_NbrOfChannel = 1;        //顺序进行规则转换的ADC通道的数目
  25.         ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   

  26.   
  27.         ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
  28.         
  29.         ADC_ResetCalibration(ADC1);        //使能复位校准  
  30.          
  31.         while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
  32.         
  33.         ADC_StartCalibration(ADC1);         //开启AD校准

  34.         while(ADC_GetCalibrationStatus(ADC1));         //等待校准结束

  35. //        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能

  36. }                                 
  37. //获得ADC值
  38. //ch:通道值 0~3
  39. u16 Get_Adc(u8 ch)   
  40. {
  41.           //设置指定ADC的规则组通道,一个序列,采样时间
  42.         ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道,采样时间为239.5周期                                      
  43.   
  44.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能        
  45.          
  46.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

  47.         return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
  48. }

  49. u16 Get_Adc_Average(u8 ch,u8 times)
  50. ……………………

  51. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
12、器件清单(针对本设计,1对1,直接用).zip (7.67 KB, 下载次数: 456)
回复

使用道具 举报

ID:150611 发表于 2019-5-4 19:41 | 显示全部楼层
好资料,来仔细研究研究
回复

使用道具 举报

ID:476217 发表于 2019-5-6 07:45 | 显示全部楼层
好资料。很需要。我能检测到电压就是不准,不知道怎么校准,是不是还需要一个校准电源?研究中。
回复

使用道具 举报

ID:437641 发表于 2019-5-29 22:14 来自手机 | 显示全部楼层
你好,可以问你一些问题吗?
回复

使用道具 举报

ID:375265 发表于 2019-6-18 08:49 | 显示全部楼层
好资料,来仔细研究研究
回复

使用道具 举报

ID:582900 发表于 2019-7-15 19:50 | 显示全部楼层
你好, 这个是怎么测试电压有效值的呢?
回复

使用道具 举报

ID:265454 发表于 2019-10-18 15:24 | 显示全部楼层
很需要呀
回复

使用道具 举报

ID:412814 发表于 2019-10-21 08:47 | 显示全部楼层
正需要这个资料呢,谢谢楼主
回复

使用道具 举报

ID:76408 发表于 2019-11-16 09:35 | 显示全部楼层
楼主辛苦,收藏了,,,,。
回复

使用道具 举报

ID:500009 发表于 2019-11-23 13:16 来自手机 | 显示全部楼层
正好需要,多谢分享
回复

使用道具 举报

ID:76408 发表于 2019-11-27 13:58 | 显示全部楼层
谢谢楼主,我下载了试试看行不行。
回复

使用道具 举报

ID:700642 发表于 2020-3-1 15:11 | 显示全部楼层
学习一下,不知道直接用esp8266行不行
回复

使用道具 举报

ID:75468 发表于 2020-3-5 16:37 | 显示全部楼层
非常好的资料,谢谢楼主的分享。
回复

使用道具 举报

ID:696302 发表于 2020-3-11 17:39 | 显示全部楼层
正需要这个呢 感谢分享
回复

使用道具 举报

ID:729780 发表于 2020-4-15 15:17 | 显示全部楼层
谢谢楼主,研究一下
回复

使用道具 举报

ID:730711 发表于 2020-4-17 16:27 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:730711 发表于 2020-4-17 16:29 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:806637 发表于 2020-7-22 11:02 | 显示全部楼层
只有3个资料是吗
回复

使用道具 举报

ID:295874 发表于 2020-8-2 09:55 | 显示全部楼层
这程序大致看了一下,测试交流电压,能这样子用吗?这样子测试直流电可以,交流电还是需要DFT比较准确。
回复

使用道具 举报

ID:410617 发表于 2020-8-16 22:22 | 显示全部楼层
特别好的的资料,刚好要做这样的项目
回复

使用道具 举报

ID:792111 发表于 2020-8-25 13:06 | 显示全部楼层
电流检测模块是什么型号的呢?有没有原理图?
回复

使用道具 举报

ID:87000 发表于 2020-8-26 15:32 | 显示全部楼层
先下载看看怎么样。要是一个压缩包就好了。
回复

使用道具 举报

ID:108573 发表于 2020-8-27 08:41 | 显示全部楼层
有傅立叶变换部分吗,可以算功率因数和频率等电参量不
回复

使用道具 举报

ID:214628 发表于 2020-9-17 10:13 | 显示全部楼层
这个兄弟,资料好像不全啊。原理图没有,资料简介使用说明之类的也没有,能全部提供一下吗。
回复

使用道具 举报

ID:69829 发表于 2020-11-23 21:58 | 显示全部楼层
好资料,最近在做三相电的电流电压检测,应该可以参考参考
回复

使用道具 举报

ID:229137 发表于 2021-3-11 16:33 | 显示全部楼层
看看,正好用到
回复

使用道具 举报

ID:597820 发表于 2021-3-12 08:36 | 显示全部楼层
电压检测,应该可以参考
回复

使用道具 举报

ID:767852 发表于 2021-3-15 18:26 | 显示全部楼层
没用啊,上面的采集模块绿色板子买不到,也不知道型号,手机端的APP也没有,怎么可能照着做出来
回复

使用道具 举报

ID:1014660 发表于 2022-3-31 23:09 | 显示全部楼层
想要组装图
回复

使用道具 举报

ID:818203 发表于 2022-4-28 18:48 来自手机 | 显示全部楼层
变压器的名字
回复

使用道具 举报

ID:1054620 发表于 2022-11-29 13:54 | 显示全部楼层
好资料,借鉴研究一下
回复

使用道具 举报

ID:236020 发表于 2023-10-20 18:51 | 显示全部楼层
有一个项目要测交流电压,这个下载了学习一下. 谢谢分享
回复

使用道具 举报

ID:598178 发表于 2023-10-30 16:17 | 显示全部楼层
好资料,MARK一下
回复

使用道具 举报

ID:1110374 发表于 2024-1-29 23:44 | 显示全部楼层
请问精度怎么样
回复

使用道具 举报

ID:1110374 发表于 2024-1-31 17:41 | 显示全部楼层
这PCB文件也太水了吧,就一个背板图,啥电路都没有
回复

使用道具 举报

ID:1111205 发表于 2024-3-6 20:54 | 显示全部楼层
有人知道这个交流电压电流检测模块电路(TA1005、TV005)电路是怎么设计的?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表