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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7007|回復: 3
打印 上一主題 下一主題
收起左側

基于STM32F103ZET6芯片的采樣+濾波程序源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:170655 發表于 2018-9-17 11:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
可用作開發學習使用
/*
*********************************************************************************************************
*
*    例程名稱      : Ex004-按鍵檢測例程(軟件濾波+FIFO)
*    例程版本      : V2.0
*    ST固件庫版本  :V3.5.0
*    作    者      : armfly
*    發布日期      : 2011-10-16
*
*    開發環境      : KEIL的uVision V3.70、uVision V4.13、IAR的EWARM V5.30
*
*    修改記錄      :
*        2010-09-27 發布V1.0版本,固件庫為V3.1.2
*        2011-03-20 發布V1.1版本,固件庫為V3.4.0
*        2011-11-16 發布2.0版本,固件庫為V3.5.0,優化工程結構,打印信息改為中文
*
*********************************************************************************************************
*/

【1】例程介紹        
    這個例子演示如何使用ADC以及如何對ADC采樣值進行濾波處理。
    Systick中斷服務程序每個1ms啟動并采集一次ADC值(PC4口線,可調電阻),并且對最近的20個樣本進行求平均值。
    平均值保存在全局變量g_usAdcValue中。主程序定時讀取這個變量,并將值打印到串口1。

    實際測試數據:
    (1)程序在CPU內部Flash或者內部RAM執行時,樣本個數取20個,則采樣值非常穩定(1個字跳動)
    (2)程序在外部SRAM運行時,由于3.3V電源波動,因此采樣值跳動較大。
        
    請用串口線將開發板的COM1口連接到PC機的串口(或者USB串口),然后打開超級終端軟件(XP自帶的或者SecureCRT
    軟件),可以在PC軟件界面看到例程的運行信息。
   
    程序具有如下功能:
        - 復位后打印例程基本信息
        - 主程序定時將ADC值打印到串口1
        - 調節開發板上的可調電阻,超級終端界面上會顯示一個不斷旋轉的字符 + 實時的ADC平均值

    程序執行結果如下:
        *************************************************************
        * 例程名稱   : ADC采樣和濾波例程
        * 例程版本   : 2.0
        * 發布日期   : 2011-10-16
        * 固件庫版本 : 3.5.0
        *************************************************************
        請調節開發板上的精密可調電阻,觀察ADC采樣值的變化
        / PC4口線ADC采樣值 =  2149 , 電壓 = 1731mV

    對于Keil MDK,為了避免中文字符串告警,需要在C/C++編譯選項中增加 --diag_suppress=870 參數。   

    本程序支持在CPU內部Flash、CPU內部RAM和CPU外部RAM調試。在CPU內部RAM和CPU外部SRAM調試時,無需切換開發板上的
    啟動模式撥碼開關。請將撥碼開關撥到Flash位置。

單片機源程序如下:
  1. /*
  2. *********************************************************************************************************
  3. *                                          
  4. *        模塊名稱 : 主程序模塊。
  5. *        文件名稱 : main.c
  6. *        版    本 : V2.0
  7. *        說    明 : ADC采樣和濾波例程。
  8. *        修改記錄 :
  9. *                版本號  日期       作者    說明
  10. *                v1.0    2011-08-27 armfly  ST固件庫V3.5.0版本。
  11. *                v2.0    2011-10-16 armfly  優化工程結構。
  12. *
  13. *********************************************************************************************************
  14. */

  15. #include "stm32f10x.h"                /* 如果要用ST的固件庫,必須包含這個文件 */
  16. #include <stdio.h>                        /* 因為用到了printf函數,所以必須包含這個文件 */
  17. #include "bsp_usart.h"                /* printf函數定向輸出到串口,所以必須包含這個文件 */
  18. #include "bsp_led.h"                /* LED指示燈驅動模塊 */
  19. #include "bsp_button.h"                /* 按鍵驅動模塊 */
  20. #include "bsp_timer.h"                /* systick定時器模塊 */

  21. /* 定義例程名和例程發布日期 */                                       
  22. #define EXAMPLE_NAME        "ADC采樣和濾波例程"
  23. #define EXAMPLE_DATE        "2011-10-16"
  24. #define DEMO_VER                "2.0"

  25. #define SAMP_COUNT        20                /* 樣本個數,表示200ms內的采樣數據求平均值 */
  26. /*
  27.         實際測試數據:
  28.         (1)程序在CPU內部Flash或者內部RAM執行時,樣本個數取20個,則采樣值非常穩定
  29.         (2)程序在外部SRAM運行時,由于3.3V電源波動,因此采樣值跳動較大。

  30. */

  31. /* 僅允許本文件內調用的函數聲明 */
  32. static void InitBoard(void);
  33. static void PrintfLogo(void);
  34. static uint16_t GetADC(void);
  35. static void ADC_Configuration(void);

  36. uint16_t g_usAdcValue;        /* ADC 采樣值的平均值 */

  37. /*
  38. *********************************************************************************************************
  39. *        函 數 名: main
  40. *        功能說明: c程序入口
  41. *        形    參:無
  42. *        返 回 值: 錯誤代碼(無需處理)
  43. *********************************************************************************************************
  44. */
  45. int main(void)
  46. {
  47.         uint16_t usValue;

  48.         /*
  49.                 由于ST固件庫的啟動文件已經執行了CPU系統時鐘的初始化,所以不必再次重復配置系統時鐘。
  50.                 啟動文件配置了CPU主時鐘頻率、內部Flash訪問速度和可選的外部SRAM FSMC初始化。
  51.                
  52.                 系統時鐘缺省配置為72MHz,如果需要更改,可以修改:
  53.                 \Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c
  54.                 中配置系統時鐘的宏。
  55.         */
  56.        
  57.         InitBoard();        /* 為了是main函數看起來更簡潔些,我們將硬件初始化的代碼封裝到這個函數 */
  58.         PrintfLogo();        /* 打印例程Logo到串口1 */       

  59.         printf("請調節開發板上的精密可調電阻,觀察ADC采樣值的變化\r\n");

  60.         ADC_Configuration();        /* 配置PC4 為ADC1_IN14 */

  61.         bsp_StartTimer(1, 300);        /* 定時器0周期 200毫秒 */

  62.         /* 進入主程序循環體 */
  63.         while (1)
  64.         {
  65.                 CPU_IDLE();          /* 這個宏在bsp_timer.h 中定義,目前定義為空。用戶可以修改這個宏實現CPU休眠和喂狗 */

  66.                 if (bsp_CheckTimer(1))        /* 定時到 */
  67.                 {
  68.                         bsp_StartTimer(1, 300);        /* 啟動下個定時周期 */

  69.                         usValue = GetADC();

  70.                         /* 注意: 末尾只有 \r回車, 沒有\n換行,可以使PC超級終端界面穩定在1行顯示 */
  71.                         {
  72.                                 /* 超級終端界面上會顯示一個不斷旋轉的字符
  73.                                 增加這個功能,是為了避免程序死機的假象,因為ADC采樣值很穩定
  74.                                 */
  75.                                 static uint8_t pos = 0;

  76.                                 if (pos == 0)
  77.                                         printf("|");
  78.                                 else if (pos == 1)
  79.                                         printf("/");
  80.                                 else if (pos == 2)
  81.                                         printf("-");
  82.                                 else if (pos == 3)
  83.                                         printf("\\");                /* 注意:這個特殊字符需要轉義 */

  84.                                 if (++pos >= 4)
  85.                                 {
  86.                                         pos = 0;
  87.                                 }

  88.                                 printf(" PC4口線ADC采樣值 = %5d , 電壓 = %4dmV\r",
  89.                                         usValue, ((uint32_t)usValue * 3300) / 4095);

  90.                         }
  91.                 }

  92.                 /* 這個地方可以插入 GetKey(), 擴充對按鍵的響應代碼 */
  93.         }
  94. }

  95. /*
  96. *********************************************************************************************************
  97. *        函 數 名: ADC_Configuration
  98. *        功能說明: 配置ADC, PC4模式
  99. *        形    參:無
  100. *        返 回 值: 無
  101. *********************************************************************************************************
  102. */
  103. static void ADC_Configuration(void)
  104. {
  105.         GPIO_InitTypeDef GPIO_InitStructure;
  106.         ADC_InitTypeDef ADC_InitStructure;
  107.         __IO uint16_t ADCConvertedValue;

  108.     /* 使能 ADC1 and GPIOC clock */
  109.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);

  110.         /* 配置PC4為模擬輸入(ADC Channel14) */
  111.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  112.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  113.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  114.         /* 配置ADC1, 不用DMA, 用軟件觸發 */
  115.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  116.         ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  117.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  118.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  119.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  120.         ADC_InitStructure.ADC_NbrOfChannel = 1;
  121.         ADC_Init(ADC1, &ADC_InitStructure);

  122.         /* 配置ADC1 規則通道14 channel14 configuration */
  123.         ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_55Cycles5);

  124.         /* 使能ADC1 DMA功能 */
  125.         ADC_DMACmd(ADC1, ENABLE);

  126.         /* 使能 ADC1 */
  127.         ADC_Cmd(ADC1, ENABLE);

  128.         /* 使能ADC1 復位校準寄存器 */
  129.         ADC_ResetCalibration(ADC1);
  130.         /* 檢查ADC1的復位寄存器 */
  131.         while(ADC_GetResetCalibrationStatus(ADC1));

  132.         /* 啟動ADC1校準 */
  133.         ADC_StartCalibration(ADC1);
  134.         /* 檢查校準是否結束 */
  135.         while(ADC_GetCalibrationStatus(ADC1));

  136.         /* 軟件啟動ADC轉換 */
  137.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  138. }

  139. /*
  140. *********************************************************************************************************
  141. *        函 數 名: AdcPro
  142. *        功能說明: ADC采樣處理,插入1ms systick中斷進行調用
  143. *        形    參:無
  144. *        返 回 值: 無
  145. *********************************************************************************************************
  146. */
  147. void AdcPro(void)
  148. {
  149.         static uint16_t buf[SAMP_COUNT];
  150.         static uint8_t write;
  151.         uint32_t sum;
  152.         uint8_t i;

  153.         buf[write] = ADC_GetConversionValue(ADC1);
  154.         if (++write >= SAMP_COUNT)
  155.         {
  156.                 write = 0;
  157.         }

  158.         /* 下面這段代碼采用求平均值的方法進行濾波
  159.                 也可以改善下,選擇去掉最大和最下2個值,使數據更加精確
  160.         */
  161.         sum = 0;
  162.         for (i = 0; i < SAMP_COUNT; i++)
  163.         {
  164.                 sum += buf[i];
  165.         }
  166.         g_usAdcValue = sum / SAMP_COUNT;        /* ADC采樣值由若干次采樣值平均 */

  167.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);        /* 軟件啟動下次ADC轉換 */
  168. }

  169. /*
  170. *********************************************************************************************************
  171. *        函 數 名: GetADC
  172. *        功能說明: 讀取ADC采樣的平均值
  173. *        形    參:無
  174. *        返 回 值: 無
  175. *********************************************************************************************************
  176. */
  177. static uint16_t GetADC(void)
  178. {
  179.         uint16_t ret;

  180.         /* 因為        g_AdcValue 變量在systick中斷中改寫,為了避免主程序讀變量時被中斷程序打亂導致數據錯誤,因此需要
  181.         關閉中斷進行保護 */

  182.         /* 進行臨界區保護,關閉中斷 */
  183.         __set_PRIMASK(1);  /* 關中斷 */

  184.         ret = g_usAdcValue;

  185.         __set_PRIMASK(0);  /* 開中斷 */

  186.         return ret;
  187. }

  188. /*
  189. *********************************************************************************************************
  190. *        函 數 名: InitBoard
  191. *        功能說明: 初始化硬件設備
  192. *        形    參:無
  193. *        返 回 值: 無
  194. *********************************************************************************************************
  195. */
  196. static void InitBoard(void)
  197. {       
  198.         /* 配置串口,用于printf輸出 */
  199.         bsp_InitUart();
  200.        
  201.         /* 配置LED指示燈GPIO */
  202.         bsp_InitLed();

  203.         /* 配置按鍵GPIO, 必須在bsp_InitTimer之前調用 */
  204.         bsp_InitButton();

  205.         /* 初始化systick定時器,并啟動定時中斷 */
  206.         bsp_InitTimer();
  207. }

  208. /*
  209. *********************************************************************************************************
  210. *        函 數 名: PrintfLogo
  211. *        功能說明: 打印例程名稱和例程發布日期, 接上串口線后,打開PC機的超級終端軟件可以觀察結果
  212. *        形    參:無
  213. *        返 回 值: 無
  214. *********************************************************************************************************
  215. */
  216. static void PrintfLogo(void)
  217. {
  218.         printf("*************************************************************\n\r");
  219.         printf("* 例程名稱   : %s\r\n", EXAMPLE_NAME);        /* 打印例程名稱 */
  220.         printf("* 例程版本   : %s\r\n", DEMO_VER);                /* 打印例程版本 */
  221.         printf("* 發布日期   : %s\r\n", EXAMPLE_DATE);        /* 打印例程日期 */

  222.         /* 打印ST固件庫版本,這3個定義宏在stm32f10x.h文件中 */
  223.         printf("* 固件庫版本 : %d.%d.%d\r\n", __STM32F10X_STDPERIPH_VERSION_MAIN,
  224.                         __STM32F10X_STDPERIPH_VERSION_SUB1,__STM32F10X_STDPERIPH_VERSION_SUB2);               
  225.         printf("* \n\r");        /* 打印一行空格 */
  226.         printf("* QQ    : 1295744630 \r\n");
  227.         printf("* Email : armfly@qq.com \r\n");
  228.         printf("* Copyright www.armfly.com 安富萊電子\r\n");
  229.         printf("*************************************************************\n\r");
  230. }
復制代碼

所有資料51hei提供下載:
ADC采樣和濾波例程.rar (472.09 KB, 下載次數: 117)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:485105 發表于 2019-6-5 09:39 | 只看該作者
666,用了
回復

使用道具 舉報

板凳
ID:361429 發表于 2019-12-8 17:38 | 只看該作者
謝謝分享。
回復

使用道具 舉報

地板
ID:165291 發表于 2024-5-16 09:20 | 只看該作者
。。。平均值濾波有缺點。。。有沒有什么好的方法。。。采樣電路采集正負信號嗎?正負信號怎么平均值?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产美女在线看 | 高清欧美性猛交xxxx黑人猛交 | 亚洲综合国产精品 | 黄色免费在线观看网站 | 91久久国产综合久久 | 亚洲色片网站 | 黄色成人av | 麻豆视频在线免费观看 | 国产一区2区 | 正在播放国产精品 | 中文字幕一区二区三 | 亚洲综合成人网 | 香蕉av免费| 国产无套一区二区三区久久 | 91视频一区二区 | 人人玩人人添人人澡欧美 | 在线精品国产 | 久久一区二区三区四区 | 久久久久久高潮国产精品视 | 国产在线高清 | 日韩精品一区二区三区中文字幕 | 国产一级片在线观看视频 | 国产精品精品久久久久久 | 亚洲精品二区 | 成人欧美日韩一区二区三区 | 国产精品一区二区不卡 | 国产成人自拍av | 日韩亚洲一区二区 | 亚洲天堂成人在线视频 | av一区二区三区四区 | 99精品99| 一a一片一级一片啪啪 | 国产精品视频999 | 国产精品视频专区 | 亚洲成人中文字幕 | 在线免费观看黄a | 怡红院成人在线视频 | a在线免费观看视频 | 欧美成人精品激情在线观看 | 国产精品不卡一区二区三区 | 草樱av|