标题: STM32单片机智能电表交流电压电流程序设计(电流 电压互感器TV1005M+TA1005M) [打印本页]

作者: LS4    时间: 2019-4-15 15:50
标题: STM32单片机智能电表交流电压电流程序设计(电流 电压互感器TV1005M+TA1005M)
5、基于STM32F103单片机智能电表交流电压电流设计
本设计由STM32单片机核心板电路+交流电压电流检测模块电路+WIFI模块电路+指示灯电路组成。
1、通过电压互感器TV1005M和电流互感器TA1005M分别检测交流电压和交流电流值,
2、手机APP和WiFi模块互联后,可以实时显示交流电压、交流电流、功率和电量实时显示在手机上。
3、当功率超过200W时,继电器自动断开。功率不超过200W时,可以手动控制继电器的开关。
4、手机和WiFi模块连接后,手机上显示计时时间。


名称: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, 下载次数: 489)
源程序(C语言含详细备注).7z (927.4 KB, 下载次数: 519)
5、基于STM32F103单片机智能电表交流电压电流设计PCB.pdf (85.86 KB, 下载次数: 775)


   

作者: dykonka    时间: 2019-5-4 19:41
好资料,来仔细研究研究
作者: ttmax2    时间: 2019-5-6 07:45
好资料。很需要。我能检测到电压就是不准,不知道怎么校准,是不是还需要一个校准电源?研究中。
作者: 187777797524    时间: 2019-5-29 22:14
你好,可以问你一些问题吗?
作者: jiaolian586    时间: 2019-6-18 08:49
好资料,来仔细研究研究
作者: wan12345    时间: 2019-7-15 19:50
你好, 这个是怎么测试电压有效值的呢?
作者: mcusun2000    时间: 2019-10-18 15:24
很需要呀
作者: jifengjianwu    时间: 2019-10-21 08:47
正需要这个资料呢,谢谢楼主
作者: 成森林    时间: 2019-11-16 09:35
楼主辛苦,收藏了,,,,。
作者: 莫陌    时间: 2019-11-23 13:16
正好需要,多谢分享
作者: 成森林    时间: 2019-11-27 13:58
谢谢楼主,我下载了试试看行不行。
作者: thornhill    时间: 2020-3-1 15:11
学习一下,不知道直接用esp8266行不行
作者: bjfxxc    时间: 2020-3-5 16:37
非常好的资料,谢谢楼主的分享。
作者: liucw2056    时间: 2020-3-11 17:39
正需要这个呢 感谢分享
作者: 戴姆51hei    时间: 2020-4-15 15:17
谢谢楼主,研究一下
作者: YJim    时间: 2020-4-17 16:27
谢谢分享!
作者: YJim    时间: 2020-4-17 16:29
谢谢分享!
作者: karoe    时间: 2020-7-22 11:02
只有3个资料是吗

作者: liyongan_1985    时间: 2020-8-2 09:55
这程序大致看了一下,测试交流电压,能这样子用吗?这样子测试直流电可以,交流电还是需要DFT比较准确。
作者: 85845594    时间: 2020-8-16 22:22
特别好的的资料,刚好要做这样的项目
作者: 挖机    时间: 2020-8-25 13:06
电流检测模块是什么型号的呢?有没有原理图?
作者: 西点钟灵毓秀    时间: 2020-8-26 15:32
先下载看看怎么样。要是一个压缩包就好了。
作者: 神出没    时间: 2020-8-27 08:41
有傅立叶变换部分吗,可以算功率因数和频率等电参量不
作者: zhczlzhang    时间: 2020-9-17 10:13
这个兄弟,资料好像不全啊。原理图没有,资料简介使用说明之类的也没有,能全部提供一下吗。
作者: kanwoe    时间: 2020-11-23 21:58
好资料,最近在做三相电的电流电压检测,应该可以参考参考
作者: world_all    时间: 2021-3-11 16:33
看看,正好用到
作者: mouse_ox    时间: 2021-3-12 08:36
电压检测,应该可以参考
作者: 嬴政天下yhj    时间: 2021-3-15 18:26
没用啊,上面的采集模块绿色板子买不到,也不知道型号,手机端的APP也没有,怎么可能照着做出来
作者: hpwpy    时间: 2022-3-31 23:09
想要组装图
作者: 一样一样bhhh    时间: 2022-4-28 18:48
变压器的名字
作者: shunjianyouleni    时间: 2022-11-29 13:54
好资料,借鉴研究一下
作者: 576144025    时间: 2023-10-20 18:51
有一个项目要测交流电压,这个下载了学习一下. 谢谢分享
作者: adee4210    时间: 2023-10-30 16:17
好资料,MARK一下
作者: Chyyy06    时间: 2024-1-29 23:44
请问精度怎么样
作者: Chyyy06    时间: 2024-1-31 17:41
这PCB文件也太水了吧,就一个背板图,啥电路都没有
作者: kiyo_v    时间: 2024-3-6 20:54
有人知道这个交流电压电流检测模块电路(TA1005、TV005)电路是怎么设计的?
作者: 雾往梦    时间: 2024-5-8 17:28
为什么我互感器输出的是负压




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1