標(biāo)題: STM32單片機(jī)智能電表交流電壓電流程序設(shè)計(電流 電壓互感器TV1005M+TA1005M) [打印本頁]

作者: LS4    時間: 2019-4-15 15:50
標(biāo)題: STM32單片機(jī)智能電表交流電壓電流程序設(shè)計(電流 電壓互感器TV1005M+TA1005M)
5、基于STM32F103單片機(jī)智能電表交流電壓電流設(shè)計
本設(shè)計由STM32單片機(jī)核心板電路+交流電壓電流檢測模塊電路+WIFI模塊電路+指示燈電路組成。
1、通過電壓互感器TV1005M和電流互感器TA1005M分別檢測交流電壓和交流電流值,
2、手機(jī)APP和WiFi模塊互聯(lián)后,可以實時顯示交流電壓、交流電流、功率和電量實時顯示在手機(jī)上。
3、當(dāng)功率超過200W時,繼電器自動斷開。功率不超過200W時,可以手動控制繼電器的開關(guān)。
4、手機(jī)和WiFi模塊連接后,手機(jī)上顯示計時時間。


名稱:AUAISOUT000
IP及端口號:10.10.10.11:8080

接受內(nèi)容:
V:123A:12345P:1234567Q:1234567.89T:123R:1

說明:(只增加R部分命令及發(fā)送內(nèi)容,其他未變動)   
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 單片機(jī)設(shè)備運(yùn)行時間
R:1        表示繼電器接通 供電中 0表示斷開即過載

發(fā)送內(nèi)容:*或者#     #斷開供電    *接通供電

元件清單:
極性電容    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線_大頭    /
導(dǎo)線(只萬用板有)    /
焊錫    /

單片機(jī)源程序如下:
  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];//打印電壓數(shù)組
  10. //char tabDataA[7];//打印電流數(shù)組
  11. //char tabDataP[9];//打印功率數(shù)組
  12. //char tabDataQ[12];//打印電量數(shù)組
  13. //char tabDataT[6];//打印時間數(shù)組
  14. char tabData[42];//打印時間數(shù)組

  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();                     //延時函數(shù)初始化         
  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;        //繼電器狀態(tài)標(biāo)識
  32.         delay_ms(4000);
  33.         
  34.         printf("AT+CIPMUX=1\r\n");                   //允許鏈接
  35.         delay_ms(1000);
  36.         printf("AT+CIPSERVER=1,8080\r\n");           //創(chuàng)建端口號8080
  37.         delay_ms(1000);
  38.         while(1)
  39.         {
  40.                 adcx=Get_Adc_Average(ADC_Channel_1,10);// PA1 交流電壓檢測口 ad轉(zhuǎn)換10次求平均值
  41.                 temp=(float)adcx*(3.3/4096);
  42.                 ACvolt=(unsigned int)(temp*303);//*303 互感器計算獲取 以及1K電阻 用示波器檢測校準(zhǔn)得到
  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 互感器計算獲取擴(kuò)大1000倍 以及1K電阻 用示波器檢測校準(zhǔn)得到 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)//處理標(biāo)志
  59.                 {
  60.                         dealFlag=0;
  61.                         PowerQd=(float)PowerWt*1/60.0/60.0+PowerQd;        //累計電量 1表示1s 因為電流擴(kuò)大了1000倍 因此該處也擴(kuò)大了1000倍 且此處功率單位為W 除以1000為千瓦 結(jié)果為度 1度=1千瓦時
  62.                 }
  63.                
  64.                 if(times>=9999)
  65.                 {times=0;}
  66.                
  67.                 if(PowerWt/1000>200)
  68.                 {        
  69.                         RELAY=0;                        //關(guān)閉繼電器
  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);                }//打印數(shù)據(jù)
  79.                 else
  80.                 {sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:0",ACvolt,ACcurrent,PowerWt,PowerQd,times);                }//打印數(shù)據(jù)
  81.         
  82.                
  83.                 printf("AT+CIPSEND=0,42\r\n");                //發(fā)送固定字節(jié)數(shù)據(jù)的at命令
  84.                 delay_ms(200);
  85.                 printf(tabData);                                        //發(fā)送數(shù)據(jù)
  86.                 delay_ms(200);

  87.                 LED0=!LED0;                //數(shù)據(jù)發(fā)送        
  88.                 delay_ms(200);                //延時
  89.         }                                                                                            
  90. }        
復(fù)制代碼
  1. #include "adc.h"
  2. #include "delay.h"
  3.    
  4.                   
  5. //初始化ADC
  6. //這里我們僅以規(guī)則通道為例
  7. //我們默認(rèn)將開啟通道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);   //設(shè)置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);  //復(fù)位ADC1,將外設(shè) ADC1 的全部寄存器重設(shè)為缺省值

  19.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在獨立模式
  20.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //模數(shù)轉(zhuǎn)換工作在單通道模式
  21.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模數(shù)轉(zhuǎn)換工作在單次轉(zhuǎn)換模式
  22.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //轉(zhuǎn)換由軟件而不是外部觸發(fā)啟動
  23.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC數(shù)據(jù)右對齊
  24.         ADC_InitStructure.ADC_NbrOfChannel = 1;        //順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目
  25.         ADC_Init(ADC1, &ADC_InitStructure);        //根據(jù)ADC_InitStruct中指定的參數(shù)初始化外設(shè)ADCx的寄存器   

  26.   
  27.         ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
  28.         
  29.         ADC_ResetCalibration(ADC1);        //使能復(fù)位校準(zhǔn)  
  30.          
  31.         while(ADC_GetResetCalibrationStatus(ADC1));        //等待復(fù)位校準(zhǔn)結(jié)束
  32.         
  33.         ADC_StartCalibration(ADC1);         //開啟AD校準(zhǔn)

  34.         while(ADC_GetCalibrationStatus(ADC1));         //等待校準(zhǔn)結(jié)束

  35. //        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的軟件轉(zhuǎn)換啟動功能

  36. }                                 
  37. //獲得ADC值
  38. //ch:通道值 0~3
  39. u16 Get_Adc(u8 ch)   
  40. {
  41.           //設(shè)置指定ADC的規(guī)則組通道,一個序列,采樣時間
  42.         ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道,采樣時間為239.5周期                                      
  43.   
  44.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的軟件轉(zhuǎn)換啟動功能        
  45.          
  46.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待轉(zhuǎn)換結(jié)束

  47.         return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1規(guī)則組的轉(zhuǎn)換結(jié)果
  48. }

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

  51. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼


所有資料51hei提供下載:
12、器件清單(針對本設(shè)計,1對1,直接用).zip (7.67 KB, 下載次數(shù): 489)
源程序(C語言含詳細(xì)備注).7z (927.4 KB, 下載次數(shù): 519)
5、基于STM32F103單片機(jī)智能電表交流電壓電流設(shè)計PCB.pdf (85.86 KB, 下載次數(shù): 775)


   

作者: dykonka    時間: 2019-5-4 19:41
好資料,來仔細(xì)研究研究
作者: ttmax2    時間: 2019-5-6 07:45
好資料。很需要。我能檢測到電壓就是不準(zhǔn),不知道怎么校準(zhǔn),是不是還需要一個校準(zhǔn)電源?研究中。
作者: 187777797524    時間: 2019-5-29 22:14
你好,可以問你一些問題嗎?
作者: jiaolian586    時間: 2019-6-18 08:49
好資料,來仔細(xì)研究研究
作者: 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
學(xué)習(xí)一下,不知道直接用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比較準(zhǔn)確。
作者: 85845594    時間: 2020-8-16 22:22
特別好的的資料,剛好要做這樣的項目
作者: 挖機(jī)    時間: 2020-8-25 13:06
電流檢測模塊是什么型號的呢?有沒有原理圖?
作者: 西點鐘靈毓秀    時間: 2020-8-26 15:32
先下載看看怎么樣。要是一個壓縮包就好了。
作者: 神出沒    時間: 2020-8-27 08:41
有傅立葉變換部分嗎,可以算功率因數(shù)和頻率等電參量不
作者: zhczlzhang    時間: 2020-9-17 10:13
這個兄弟,資料好像不全啊。原理圖沒有,資料簡介使用說明之類的也沒有,能全部提供一下嗎。
作者: kanwoe    時間: 2020-11-23 21:58
好資料,最近在做三相電的電流電壓檢測,應(yīng)該可以參考參考
作者: world_all    時間: 2021-3-11 16:33
看看,正好用到
作者: mouse_ox    時間: 2021-3-12 08:36
電壓檢測,應(yīng)該可以參考
作者: 嬴政天下yhj    時間: 2021-3-15 18:26
沒用啊,上面的采集模塊綠色板子買不到,也不知道型號,手機(jī)端的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
有一個項目要測交流電壓,這個下載了學(xué)習(xí)一下. 謝謝分享
作者: 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)電路是怎么設(shè)計的?
作者: 霧往夢    時間: 2024-5-8 17:28
為什么我互感器輸出的是負(fù)壓




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1