5、基于STM32F103單片機智能電表交流電壓電流設計
本設計由STM32單片機核心板電路+交流電壓電流檢測模塊電路+WIFI模塊電路+指示燈電路組成。
1、通過電壓互感器TV1005M和電流互感器TA1005M分別檢測交流電壓和交流電流值,
2、手機APP和WiFi模塊互聯后,可以實時顯示交流電壓、交流電流、功率和電量實時顯示在手機上。
3、當功率超過200W時,繼電器自動斷開。功率不超過200W時,可以手動控制繼電器的開關。
4、手機和WiFi模塊連接后,手機上顯示計時時間。
stm32-5 (1).JPG (176.27 KB, 下載次數: 120)
下載附件
2019-4-17 01:45 上傳
stm32-5 (3).JPG (167.63 KB, 下載次數: 86)
下載附件
2019-4-17 01:45 上傳
stm32-5 (5).JPG (166.97 KB, 下載次數: 102)
下載附件
2019-4-17 01:45 上傳
名稱: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線_大頭 /
導線(只萬用板有) /
焊錫 /
單片機源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "lcd.h"
- #include "adc.h"
- #include <stdio.h>
- #include "timer.h"
- //char tabDataV[5];//打印電壓數組
- //char tabDataA[7];//打印電流數組
- //char tabDataP[9];//打印功率數組
- //char tabDataQ[12];//打印電量數組
- //char tabDataT[6];//打印時間數組
- char tabData[42];//打印時間數組
- unsigned int ACcurrent; //市電電流
- unsigned int ACvolt; //市電電壓
- unsigned long PowerWt=0;//功率
- float PowerQd=0;//功率
- unsigned char relayFlag=1;
- int main(void)
- {
- u16 adcx;
- float temp;
- delay_init(); //延時函數初始化
- uart_init(9600); //串口初始化為115200
- TIM3_Int_Init(499,7199);//50ms
- LED_Init(); //初始化與LED連接的硬件接口
- LED0=0;
- Adc_Init(); //ADC初始化
- RELAY=1; //繼電器打開
- relayFlag=1; //繼電器狀態標識
- delay_ms(4000);
-
- printf("AT+CIPMUX=1\r\n"); //允許鏈接
- delay_ms(1000);
- printf("AT+CIPSERVER=1,8080\r\n"); //創建端口號8080
- delay_ms(1000);
- while(1)
- {
- adcx=Get_Adc_Average(ADC_Channel_1,10);// PA1 交流電壓檢測口 ad轉換10次求平均值
- temp=(float)adcx*(3.3/4096);
- ACvolt=(unsigned int)(temp*303);//*303 互感器計算獲取 以及1K電阻 用示波器檢測校準得到
- if(ACvolt<15) ACvolt=0;
-
- adcx=Get_Adc_Average(ADC_Channel_2,10); // PA2 求平均值
- temp=(float)adcx*(3.3/4096);
- if(temp>0.02)
- {
- ACcurrent=(unsigned int)((temp-0.02)*3100);//*3950 互感器計算獲取擴大1000倍 以及1K電阻 用示波器檢測校準得到 0.02去除波動 防止誤判斷
- }
- else
- {
- ACcurrent=0;
- }
- if(ACcurrent<50)ACcurrent=0;//濾除電流
- PowerWt=ACvolt*ACcurrent; //功率
-
- if(dealFlag==1)//處理標志
- {
- dealFlag=0;
- PowerQd=(float)PowerWt*1/60.0/60.0+PowerQd; //累計電量 1表示1s 因為電流擴大了1000倍 因此該處也擴大了1000倍 且此處功率單位為W 除以1000為千瓦 結果為度 1度=1千瓦時
- }
-
- if(times>=9999)
- {times=0;}
-
- if(PowerWt/1000>200)
- {
- RELAY=0; //關閉繼電器
- relayFlag=0;
- }
- sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:1",ACvolt,ACcurrent,PowerWt,PowerQd,times);
- // sprintf(tabDataA,"A:%05d",ACcurrent);//電流
- // sprintf(tabDataP,"P:%07lu",PowerWt);//功率
- // sprintf(tabDataQ,"Q:%010.2f",PowerQd);//電量
- // sprintf(tabDataT,"T:%04d",times);//時間
- if(relayFlag==1)
- {sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:1",ACvolt,ACcurrent,PowerWt,PowerQd,times); }//打印數據
- else
- {sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:0",ACvolt,ACcurrent,PowerWt,PowerQd,times); }//打印數據
-
-
- printf("AT+CIPSEND=0,42\r\n"); //發送固定字節數據的at命令
- delay_ms(200);
- printf(tabData); //發送數據
- delay_ms(200);
- LED0=!LED0; //數據發送
- delay_ms(200); //延時
- }
- }
復制代碼- #include "adc.h"
- #include "delay.h"
-
-
- //初始化ADC
- //這里我們僅以規則通道為例
- //我們默認將開啟通道0~3
- void Adc_Init(void)
- {
- ADC_InitTypeDef ADC_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道時鐘
-
- RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設置ADC分頻因子6 72M/6=12,ADC最大時間不能超過14M
- //PA1 作為模擬通道輸入引腳
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入引腳
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- ADC_DeInit(ADC1); //復位ADC1,將外設 ADC1 的全部寄存器重設為缺省值
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在獨立模式
- ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模數轉換工作在單通道模式
- ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模數轉換工作在單次轉換模式
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //轉換由軟件而不是外部觸發啟動
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC數據右對齊
- ADC_InitStructure.ADC_NbrOfChannel = 1; //順序進行規則轉換的ADC通道的數目
- ADC_Init(ADC1, &ADC_InitStructure); //根據ADC_InitStruct中指定的參數初始化外設ADCx的寄存器
-
- ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
-
- ADC_ResetCalibration(ADC1); //使能復位校準
-
- while(ADC_GetResetCalibrationStatus(ADC1)); //等待復位校準結束
-
- ADC_StartCalibration(ADC1); //開啟AD校準
-
- while(ADC_GetCalibrationStatus(ADC1)); //等待校準結束
-
- // ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的軟件轉換啟動功能
- }
- //獲得ADC值
- //ch:通道值 0~3
- u16 Get_Adc(u8 ch)
- {
- //設置指定ADC的規則組通道,一個序列,采樣時間
- ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采樣時間為239.5周期
-
- ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的軟件轉換啟動功能
-
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待轉換結束
- return ADC_GetConversionValue(ADC1); //返回最近一次ADC1規則組的轉換結果
- }
- u16 Get_Adc_Average(u8 ch,u8 times)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
12、器件清單(針對本設計,1對1,直接用).zip
(7.67 KB, 下載次數: 489)
2019-4-15 15:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
源程序(C語言含詳細備注).7z
(927.4 KB, 下載次數: 519)
2019-4-17 01:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
5、基于STM32F103單片機智能電表交流電壓電流設計PCB.pdf
(85.86 KB, 下載次數: 775)
2019-4-15 15:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|