久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
HLW8012的STM32單片機源碼-pfc功率因數測試制作及固件下載
[打印本頁]
作者:
清流水銀
時間:
2017-9-3 08:41
標題:
HLW8012的STM32單片機源碼-pfc功率因數測試制作及固件下載
基于HLW8012芯片的pfc功率因數測試儀制作資料,下面是stm32工程元源碼.
0.png
(39.46 KB, 下載次數: 149)
下載附件
2017-9-3 15:54 上傳
單片機源程序如下:
#include "stm32_usart.h"
#include "stm32_delay.h"
#include "stm32_led.h"
#include "stm32_key.h"
#include "sys.h"
#include "stm32_oled.h"
#include "stm32_timer.h"
char tempStr[30];
int tempStrLen;
int tempI;
float hlw8012_f;
float hlw8012_P;
float hlw8012_Pp = 103.5 / 21.6;
extern recType tRecType;
u32 countTotal;
float hlw8012_f;
u32 freq_arr;
#define CNT_TO_US(cnt) (u32)((cnt + (TIM4_FREQ / 2000000)) / (TIM4_FREQ / 1000000) ) // 獲取周期 ((cnt + 36) / 72) (cnt / 72) 四舍五入 u16 or u32
#define CNT_TO_FREQ(cnt) (u32)((TIM1_FREQ + (cnt / 2 )) / cnt ) // 獲取頻率 (72000000 / cnt) 四舍五入 u32
#define FREQ_TO_CNT(freq) (u32)((TIM1_FREQ + (freq / 2 )) / freq ) // 獲取計數值 (72000000 / freq) 四舍五入 u32
#define US_TO_CNT(us) (u32)((TIM1_FREQ / 1000000) * us ) // 獲取技術值 (72 * us) u32
#define U16_TO_U32(H, L) (u32)((u32)(H << 16) + L)
unsigned char data_check (recType *pRec, float *modePow);
int main(void)
{
float Pow_mode;
delay_init(); //延時初始化
NVIC_Configuration(); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
uart_init(115200);
keyInit();
OLED_Init();
LED_Init();
TIM3_Int_Init(5000, 7200-1);
OLED_Clear();
// OLED_ShowString(10 * 8,6," KEY ");
OLED_ShowCHinese(28 + 0,0,0);
OLED_ShowCHinese(28 + 16,0,1);
OLED_ShowCHinese(28 + 32,0,2);
OLED_ShowCHinese(28 + 48,0,3);
// //OLED_ShowString(0,3," www.szlcsc.com");
// OLED_ShowString(16,6,"1234");
TIM1_Cap_Init(65536 - 1, TIM1_PSC);
RCC_ClocksTypeDef RCC_ClocksStatus;
RCC_GetClocksFreq(&RCC_ClocksStatus);
printf("SYSCLK_Frequency: %d Hz\r\n", RCC_ClocksStatus.SYSCLK_Frequency);
printf("HCLK_Frequency: %d Hz\r\n", RCC_ClocksStatus.HCLK_Frequency);
printf("PCLK1_Frequency: %d Hz\r\n", RCC_ClocksStatus.PCLK1_Frequency);
printf("PCLK2_Frequency: %d Hz\r\n", RCC_ClocksStatus.PCLK2_Frequency);
while(1) {
TIM1->SR = (uint16_t)~TIM_IT_CC1; // 清中斷
TIM1->SR = (uint16_t)~TIM_IT_Update; // 清中斷
TIM_ITConfig(TIM1, TIM_IT_Update | TIM_IT_CC1, ENABLE);
TIM_Cmd(TIM1, ENABLE);
// 捕捉超過3秒
if ((tRecType.currOverCnt > (TIM1_FREQ / 65536) * 3) || (tRecType.size > 10)) {
TIM_ITConfig(TIM1, TIM_IT_Update | TIM_IT_CC1, DISABLE);
TIM_Cmd(TIM1, DISABLE);
data_check(&tRecType, &Pow_mode);
tRecType.size = 0;
tRecType.currOverCnt = 0;
if (Pow_mode > 5)
showPower(1, Pow_mode);
else
showPower(1, 20000);
}
}
return 1;
}
//u32 mYverage (u) 遞歸法:假設前n個數的平均數為avg, 那么前n+1個數的平均數avg = ((avg * n) + X) / (n + 1) = avg - avg / (n + 1) + X / (n + 1) = avg + (X - avg) / (n + 1)
float mYverage (float avg, float X, u32 n)
{
if (n == 0) {
return 0;
} else if (n == 1) {
return X;
} else if (n > 1) {
if (X > avg) {
return (avg + (X - avg) / n);
} else {
return (avg - (avg - X) / n);
}
} else {
return 0;
}
}
unsigned char data_check (recType *pRec, float *modePow)
{
unsigned char ret = 1;
float fAvg;
u32 u32Temp1, u32Temp2;
u16 i = 0, j = 0;
if (pRec->size == 0 || pRec->size == 1) { // 不夠1Hz
*modePow = 0;
ret = 0;
goto end;
}
// 矯正 數據中 溢出中斷 與 捕獲中斷 并發 造成的 溢出數據(overCnt) 順序混亂的情況
for (i = 0; i < pRec->size; i++) {
if (pRec->overCnt[i] == pRec->overCnt[i + 1]) {
if (pRec->cnt[i] > pRec->cnt[i + 1]) { // 后面的數據小于前面的數據--這種情況不應該發生
pRec->overCnt[i + 1]++;
}
}
}
// 將 數據 由 絕對值 換算為 相對值
for (i = 0; i < pRec->size - 1; i++) {
u32Temp1 = U16_TO_U32(pRec->overCnt[i + 0], pRec->cnt[i + 0]);
u32Temp2 = U16_TO_U32(pRec->overCnt[i + 1], pRec->cnt[i + 1]);
pRec->overCnt[i] = (u16)((u32Temp2 - u32Temp1) >> 16);
pRec->cnt[i] = (u16)((u32Temp2 - u32Temp1) >> 0);
}
pRec->size -= 1; // 數量減一
// 刪除 波形中 的高頻毛刺
for (i = 0; i < pRec->size; i++) {
u32Temp1 = U16_TO_U32(pRec->overCnt[i], pRec->cnt[i]);
if (CNT_TO_FREQ(u32Temp1) > 100000) { // TIM1_FREQ / 100KHz = 720 過濾掉>100KHz的波形
for (j = i; j < pRec->size - 1; j++) {
pRec->overCnt[j] = pRec->overCnt[j + 1];
pRec->cnt[j] = pRec->cnt[j + 1];
}
pRec->size--;
}
}
// 將 高頻數據 整合在一起 求平均
fAvg = 0;
for (i = 0; i < pRec->size; i++) {
u32Temp1 = U16_TO_U32(pRec->overCnt[i], pRec->cnt[i]);
fAvg = mYverage(fAvg, (float)u32Temp1, i + 1);
}
*modePow = hlw8012_Pp * CNT_TO_FREQ((u32)fAvg); // 計算功率
/********************************打印數據************************************************/
tempStrLen = sprintf(tempStr,"%f", *modePow);
txNByte(USART1, tempStr, tempStrLen);
txStr(USART1, "w\r\n");
/********************************打印數據************************************************/
end:
return ret;
}
復制代碼
所有資料51hei提供下載:
單片機源碼及固件下載.zip
(3.99 MB, 下載次數: 271)
2017-9-3 08:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
創業者聯盟
時間:
2017-9-7 10:25
頂一下
作者:
yunzhuxiao
時間:
2017-10-25 09:56
綁定
作者:
cdl511
時間:
2017-11-29 22:23
頂一下
作者:
SHAOLM
時間:
2017-12-1 09:00
扣了5個黑幣,但是下載文件不存在 ,暈
作者:
右走
時間:
2018-2-11 22:25
頂一下 正需要
作者:
wuguangyue
時間:
2018-3-23 14:59
我也想玩玩電功率表,有的資料分享一下,謝謝
作者:
kcgf
時間:
2018-5-10 14:35
不錯,支持~~
作者:
kcgf
時間:
2018-5-10 14:37
很好~想學習學習,
作者:
ABCLSL
時間:
2018-7-18 09:45
鼎 頂起 !
作者:
jzzgb
時間:
2018-9-21 16:53
謝謝共享!資料很有學習價值!
作者:
cyllife
時間:
2019-1-19 17:17
謝謝分享!
作者:
lionmon
時間:
2019-3-11 11:31
下載學習了,多謝分享
作者:
swap1
時間:
2019-4-15 15:45
不錯,支持~~
作者:
ydgzuishuai
時間:
2019-7-19 11:39
這個東西很有用哈哈哈哈
作者:
2893068776
時間:
2019-8-3 10:30
特別好用。!
作者:
jims9809303
時間:
2020-10-15 18:29
這樣計算電功率和電壓,電流,不知道準不準?
作者:
mhse
時間:
2021-1-8 19:38
很好~想學習學習
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久午夜视频
|
免费毛片在线
|
国产精品资源在线
|
久久黄网
|
欧美黑人激情
|
亚洲高清在线
|
极品在线
|
91正在播放
|
夜久久
|
av免费网站在线观看
|
久久er99热精品一区二区
|
午夜免费福利电影
|
久久久.com
|
91精品国产综合久久精品图片
|
成人深夜福利
|
国产精久久久
|
羞羞网站免费
|
久草中文在线观看
|
一二三四在线视频观看社区
|
日韩欧美黄色
|
成人免费一区二区三区视频网站
|
精品美女视频在线观看免费软件
|
日韩精品在线看
|
一级黄色毛片免费
|
亚洲成av人片在线观看无码
|
精品视频一区二区
|
精品视频在线一区
|
成人在线观看免费观看
|
国产免费福利在线
|
国产区在线观看
|
www.久久久久久久久久久久
|
亚洲精品日韩欧美
|
亚洲aⅴ
|
99亚洲国产精品
|
中文字幕中文字幕
|
久久高清精品
|
在线视频一区二区三区
|
一区二区视频免费观看
|
国产精品久久久精品
|
涩涩视频网站在线观看
|
精品久久久久久久久久久久
|