久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12367|回復: 17
收起左側

HLW8012的STM32單片機源碼-pfc功率因數測試制作及固件下載

  [復制鏈接]
ID:230642 發表于 2017-9-3 08:41 | 顯示全部樓層 |閱讀模式
基于HLW8012芯片的pfc功率因數測試儀制作資料,下面是stm32工程元源碼.
0.png

單片機源程序如下:
  1. #include "stm32_usart.h"
  2. #include "stm32_delay.h"
  3. #include "stm32_led.h"
  4. #include "stm32_key.h"
  5. #include "sys.h"
  6. #include "stm32_oled.h"
  7. #include "stm32_timer.h"

  8. char tempStr[30];
  9. int tempStrLen;
  10. int tempI;

  11. float hlw8012_f;
  12. float hlw8012_P;
  13. float hlw8012_Pp = 103.5 / 21.6;

  14. extern  recType     tRecType;
  15.         u32         countTotal;
  16.         float       hlw8012_f;
  17.         u32         freq_arr;

  18. #define CNT_TO_US(cnt)      (u32)((cnt +         (TIM4_FREQ / 2000000)) / (TIM4_FREQ / 1000000) )   // 獲取周期     ((cnt + 36) / 72)   (cnt / 72)          四舍五入    u16 or u32
  19. #define CNT_TO_FREQ(cnt)    (u32)((TIM1_FREQ +   (cnt       / 2      )) / cnt                   )   // 獲取頻率                         (72000000 / cnt)    四舍五入    u32
  20. #define FREQ_TO_CNT(freq)   (u32)((TIM1_FREQ +   (freq      / 2      )) / freq                  )   // 獲取計數值                       (72000000 / freq)   四舍五入    u32
  21. #define US_TO_CNT(us)       (u32)((TIM1_FREQ / 1000000) * us                                    )   // 獲取技術值                       (72 * us)                       u32

  22. #define U16_TO_U32(H, L)    (u32)((u32)(H << 16) + L)

  23. unsigned char data_check (recType *pRec, float *modePow);

  24. int main(void)
  25. {
  26.     float Pow_mode;
  27.     delay_init();                //延時初始化
  28.     NVIC_Configuration();   //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
  29.     uart_init(115200);
  30.    
  31.     keyInit();
  32.     OLED_Init();
  33.    
  34.     LED_Init();
  35.     TIM3_Int_Init(5000, 7200-1);
  36.    
  37.     OLED_Clear();
  38. //   OLED_ShowString(10 * 8,6," KEY  ");
  39.     OLED_ShowCHinese(28 + 0,0,0);
  40.     OLED_ShowCHinese(28 + 16,0,1);
  41.     OLED_ShowCHinese(28 + 32,0,2);
  42.     OLED_ShowCHinese(28 + 48,0,3);
  43.    
  44. //    //OLED_ShowString(0,3," www.szlcsc.com");
  45. //    OLED_ShowString(16,6,"1234");
  46.    
  47.     TIM1_Cap_Init(65536 - 1, TIM1_PSC);
  48.    
  49.    
  50.     RCC_ClocksTypeDef RCC_ClocksStatus;
  51.     RCC_GetClocksFreq(&RCC_ClocksStatus);
  52.     printf("SYSCLK_Frequency: %d Hz\r\n", RCC_ClocksStatus.SYSCLK_Frequency);
  53.     printf("HCLK_Frequency:   %d Hz\r\n", RCC_ClocksStatus.HCLK_Frequency);
  54.     printf("PCLK1_Frequency:  %d Hz\r\n", RCC_ClocksStatus.PCLK1_Frequency);
  55.     printf("PCLK2_Frequency:  %d Hz\r\n", RCC_ClocksStatus.PCLK2_Frequency);
  56.    
  57.    
  58.         while(1) {
  59.                
  60.         TIM1->SR = (uint16_t)~TIM_IT_CC1;                       // 清中斷
  61.         TIM1->SR = (uint16_t)~TIM_IT_Update;                    // 清中斷
  62.         TIM_ITConfig(TIM1, TIM_IT_Update | TIM_IT_CC1, ENABLE);
  63.         TIM_Cmd(TIM1, ENABLE);
  64.         
  65.         // 捕捉超過3秒
  66.         if ((tRecType.currOverCnt > (TIM1_FREQ / 65536) * 3) || (tRecType.size > 10)) {
  67.             TIM_ITConfig(TIM1, TIM_IT_Update | TIM_IT_CC1, DISABLE);
  68.             TIM_Cmd(TIM1, DISABLE);
  69.             
  70.             data_check(&tRecType, &Pow_mode);
  71.             tRecType.size = 0;
  72.             tRecType.currOverCnt = 0;
  73.             
  74.             if (Pow_mode > 5)
  75.                 showPower(1, Pow_mode);
  76.             else
  77.                 showPower(1, 20000);
  78.         }
  79.         }
  80.    
  81.     return 1;
  82. }

  83. //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)
  84. float mYverage (float avg, float X, u32 n)
  85. {
  86.     if (n == 0) {
  87.         return 0;
  88.     } else if (n == 1) {
  89.         return X;
  90.     } else if (n > 1) {
  91.         if (X > avg) {
  92.             return (avg + (X - avg) / n);
  93.         } else {
  94.             return (avg - (avg - X) / n);
  95.         }
  96.     } else {
  97.         return 0;
  98.     }
  99. }

  100. unsigned char data_check (recType *pRec, float *modePow)
  101. {
  102.     unsigned char ret = 1;
  103.     float fAvg;
  104.     u32 u32Temp1, u32Temp2;
  105.     u16 i = 0, j = 0;
  106.    
  107.     if (pRec->size == 0 || pRec->size == 1) {   // 不夠1Hz
  108.         *modePow = 0;
  109.         ret = 0;
  110.         goto end;
  111.     }
  112.    
  113.     // 矯正 數據中 溢出中斷 與 捕獲中斷 并發 造成的 溢出數據(overCnt) 順序混亂的情況
  114.     for (i = 0; i < pRec->size; i++) {
  115.         if (pRec->overCnt[i] == pRec->overCnt[i + 1]) {
  116.             if (pRec->cnt[i] > pRec->cnt[i + 1]) {                      // 后面的數據小于前面的數據--這種情況不應該發生
  117.                 pRec->overCnt[i + 1]++;
  118.             }
  119.         }
  120.     }
  121.    
  122.     // 將 數據 由 絕對值 換算為 相對值
  123.     for (i = 0; i < pRec->size - 1; i++) {
  124.         u32Temp1 = U16_TO_U32(pRec->overCnt[i + 0], pRec->cnt[i + 0]);
  125.         u32Temp2 = U16_TO_U32(pRec->overCnt[i + 1], pRec->cnt[i + 1]);
  126.         
  127.         pRec->overCnt[i]    = (u16)((u32Temp2 - u32Temp1) >> 16);
  128.         pRec->cnt[i]        = (u16)((u32Temp2 - u32Temp1) >> 0);
  129.     }
  130.     pRec->size -= 1;                                                    // 數量減一
  131.    
  132.     // 刪除 波形中 的高頻毛刺
  133.     for (i = 0; i < pRec->size; i++) {
  134.         u32Temp1 = U16_TO_U32(pRec->overCnt[i], pRec->cnt[i]);
  135.         if (CNT_TO_FREQ(u32Temp1) > 100000) {                   // TIM1_FREQ / 100KHz = 720 過濾掉>100KHz的波形
  136.             for (j = i; j < pRec->size - 1; j++) {
  137.                 pRec->overCnt[j]    = pRec->overCnt[j + 1];
  138.                 pRec->cnt[j]        = pRec->cnt[j + 1];
  139.             }
  140.             pRec->size--;
  141.         }
  142.     }
  143.    
  144.     // 將 高頻數據 整合在一起 求平均
  145.     fAvg = 0;
  146.     for (i = 0; i < pRec->size; i++) {
  147.         u32Temp1 = U16_TO_U32(pRec->overCnt[i], pRec->cnt[i]);
  148.         fAvg = mYverage(fAvg, (float)u32Temp1, i + 1);
  149.     }
  150.     *modePow = hlw8012_Pp * CNT_TO_FREQ((u32)fAvg);                     //  計算功率
  151.    
  152.     /********************************打印數據************************************************/
  153.     tempStrLen = sprintf(tempStr,"%f", *modePow);
  154.     txNByte(USART1, tempStr, tempStrLen);
  155.     txStr(USART1, "w\r\n");
  156.     /********************************打印數據************************************************/
  157. end:
  158.     return ret;
  159. }
復制代碼

所有資料51hei提供下載:
單片機源碼及固件下載.zip (3.99 MB, 下載次數: 271)

評分

參與人數 1黑幣 +2 收起 理由
wuguangyue + 2 贊一個!

查看全部評分

回復

使用道具 舉報

ID:231577 發表于 2017-9-7 10:25 | 顯示全部樓層
頂一下
回復

使用道具 舉報

ID:242686 發表于 2017-10-25 09:56 | 顯示全部樓層
綁定
回復

使用道具 舉報

ID:71262 發表于 2017-11-29 22:23 | 顯示全部樓層
頂一下
回復

使用道具 舉報

ID:255250 發表于 2017-12-1 09:00 | 顯示全部樓層
扣了5個黑幣,但是下載文件不存在 ,暈
回復

使用道具 舉報

ID:55591 發表于 2018-2-11 22:25 | 顯示全部樓層

頂一下  正需要
回復

使用道具 舉報

ID:295960 發表于 2018-3-23 14:59 | 顯示全部樓層
我也想玩玩電功率表,有的資料分享一下,謝謝  
回復

使用道具 舉報

ID:326812 發表于 2018-5-10 14:35 | 顯示全部樓層
不錯,支持~~
回復

使用道具 舉報

ID:326812 發表于 2018-5-10 14:37 | 顯示全部樓層
很好~想學習學習,
回復

使用道具 舉報

ID:347194 發表于 2018-7-18 09:45 | 顯示全部樓層
鼎 頂起 !
回復

使用道具 舉報

ID:100247 發表于 2018-9-21 16:53 | 顯示全部樓層
謝謝共享!資料很有學習價值!
回復

使用道具 舉報

ID:58730 發表于 2019-1-19 17:17 | 顯示全部樓層
謝謝分享!!
回復

使用道具 舉報

ID:72324 發表于 2019-3-11 11:31 | 顯示全部樓層
下載學習了,多謝分享
回復

使用道具 舉報

ID:242969 發表于 2019-4-15 15:45 | 顯示全部樓層

不錯,支持~~
回復

使用道具 舉報

ID:583329 發表于 2019-7-19 11:39 | 顯示全部樓層
這個東西很有用哈哈哈哈
回復

使用道具 舉報

ID:593572 發表于 2019-8-3 10:30 | 顯示全部樓層
特別好用!!!
回復

使用道具 舉報

ID:830387 發表于 2020-10-15 18:29 | 顯示全部樓層
這樣計算電功率和電壓,電流,不知道準不準?
回復

使用道具 舉報

ID:75487 發表于 2021-1-8 19:38 | 顯示全部樓層
很好~想學習學習
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 不卡视频在线 | 99热在线免费 | 亚洲精品欧洲 | 精品成人在线视频 | 日韩精品一区二区三区在线观看 | 欧美一区二区黄 | 伦理片97| 免费看一区二区三区 | 99re国产精品 | 91久久国产 | 风间由美一区二区三区在线观看 | 日本一区二区三区四区 | av中文字幕网站 | 日韩精品免费视频 | 国产日韩精品在线 | www.成人免费视频 | 亚洲免费精品 | 国产日韩一区二区三区 | 青青草国产在线观看 | 91精品国产91久久久久久密臀 | 亚洲午夜一区二区 | 日韩欧美在线视频 | 国产98色在线 | 日韩 | 日韩视频中文字幕 | 天天在线操| 日韩av在线免费 | 99热在线播放 | 最新中文字幕第一页视频 | 婷婷毛片 | 91一区二区| 中文字幕电影在线观看 | 国产精品色 | 日一区二区 | 久久精品久久久 | 日本免费小视频 | 久久久性色精品国产免费观看 | 日本精品一区二区在线观看 | 国产成人精品在线播放 | 国产精品福利在线观看 | 天堂久久一区 | 91视频在线看 |