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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32實現ADS1256進行數據電壓采集程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:489280 發表于 2019-3-12 15:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
通過cubeMX配置STM32RCT6的IO口與ads1256ADC模塊的連接IO口工作模式SPI,還有接受中斷接受狀態引腳,最終ADC采集數據經過卡爾曼濾波器濾波輸出,詳情請見附件

單片機源程序如下:
  1. #include "ads1256.h"
  2. int32_t adcVaule = 0x00;
  3. float voltage = 0x00;
  4. float filterVoltage = 0.0;
  5. float filterVoltage2 = 0.0;
  6. void delayXus(uint16_t us) {
  7.     uint16_t diff = 0xffff - 5 - us;
  8.     //設置定時器的計數值
  9.     __HAL_TIM_SET_COUNTER(&htim6, diff);
  10.     //啟動定時器計數
  11.     HAL_TIM_Base_Start(&htim6);
  12.     //判定計數結束
  13.     while(diff < 0xffff - 5) {
  14.         diff = __HAL_TIM_GET_COUNTER(&htim6);
  15.     }
  16.     //延時完成關閉定時器計數
  17.     HAL_TIM_Base_Stop(&htim6);
  18. }

  19. /*
  20. *   功  能:實現SPI協議總線發送一個字節的數據信息
  21. *   參  數:待發送的數據信息
  22. *   返回值:無
  23. */
  24. void spiWriteByte(uint8_t txData) {
  25.     uint8_t tempData = 0x00;
  26.     HAL_SPI_TransmitReceive(&hspi1, &txData, &tempData, 1, 100);
  27. }

  28. /*
  29. *   功  能:實現SPI協議總監接受一個字節的數據信息
  30. *   參  數:無
  31. *   返回值:接受到的數據信息
  32. */
  33. uint8_t spiReadByte(void) {
  34.     uint8_t tempDataT = 0xff;
  35.     uint8_t tempData = 0x00;
  36.     HAL_SPI_TransmitReceive(&hspi1, &tempDataT, &tempData, 1, 100);
  37.     return tempData;
  38. }

  39. /*
  40. *   功  能:向ads1256寄存器中寫入一個字節的數據
  41. *   參  數:regAdd寄存器地址 regData待寫入的數據信息
  42. *   返回值:無
  43. */
  44. void spiWriteRegData(uint8_t regAdd, uint8_t regData) {
  45.     //拉低SPI協議的CS引腳
  46.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
  47.     //等待RDY的引腳變低
  48.     while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4));
  49.     //寫入寄存地地址
  50.     spiWriteByte(WREG | (regAdd & 0x0F));
  51.     //寫入即將寫入數據的個數
  52.     spiWriteByte(0x00);
  53.     //寫入數據信息
  54.     spiWriteByte(regData);
  55.     //拉高SPI協議的CS引腳
  56.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
  57. }

  58. /*
  59. *   功  能:初始化ads1256
  60. *   參  數:無
  61. *   返回值:無
  62. */
  63. void ads1256Init(void) {
  64.     disableInterrupt();
  65.     while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4));
  66.     //開啟芯片的自校準
  67.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
  68.     spiWriteByte(SELFCAL);
  69.     while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4));
  70.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
  71.     //設置ads1256的狀態寄存器
  72.     spiWriteRegData(STATUS, 0x06);      //數據發送高位在前 自動校準 啟用buf
  73.     spiWriteRegData(MUX, MUXP_AIN0 | MUXN_AIN1); //單端模式
  74.     //設置ads1256的增益
  75.     spiWriteRegData(ADCON, GAIN_1);
  76.     //設置ads采樣速率
  77.     spiWriteRegData(DRATE, RATE_30000);
  78.     //設置IO狀態
  79.     spiWriteRegData(IO, 0x00);
  80.     //再次進行校準
  81.     while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4));
  82.     //開啟芯片的自校準
  83.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
  84.     spiWriteByte(SELFCAL);
  85.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
  86.     enableInterrupt();
  87. }

  88. /*
  89. *   功  能:從ads1256中讀取出相關數據信息
  90. *   參  數:下一次轉換通道
  91. *   返回值:讀取到的數據信息
  92. */
  93. int32_t ads1256ReadValue(uint8_t channel) {
  94.     int32_t sum = 0;
  95.     //等待準備好信號變低
  96.     while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4));
  97.     //設置下次轉換的通道
  98.     spiWriteRegData(MUX, channel);

  99.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
  100.     spiWriteByte(SYNC);     //發送同步命令
  101.     delayXus(5);
  102.     spiWriteByte(WAKEUP);   //發送喚醒命令
  103.     delayXus(5);            //延時一下
  104.     spiWriteByte(RDATA);    //發送讀數據命令
  105.     delayXus(25);
  106.     sum |= (spiReadByte() << 16);
  107.     sum |= (spiReadByte() << 8);
  108.     sum |= (spiReadByte());
  109.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
  110.     if(sum > 0x7fffff)
  111.         sum -= 0x1000000;
  112.     adcVaule = sum;
  113.     voltage = (float)(adcVaule * 5.0 / 8388607); //計算電壓
  114.     printf("ADC采集數據:%0x,%f\n", adcVaule, voltage);
  115.     HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4);
  116.     return sum;
  117. }
  118. /*
  119. *   功  能:實現ads的增益設置
  120. */
  121. void setGain(uint8_t gain) {
  122.     disableInterrupt();
  123.     while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4));
  124.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
  125.     switch(gain) {
  126.     case 0:
  127.         spiWriteRegData(ADCON, GAIN_1);
  128.         break;
  129.     case 1:
  130.         spiWriteRegData(ADCON, GAIN_2);
  131.         break;
  132.     default:
  133.         break;
  134.     }
  135.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
  136.     enableInterrupt();
  137. }
  138. /*
  139. *   功  能:設置ads1256的采集速率
  140. */
  141. void setRate(uint8_t rate) {
  142.     disableInterrupt();
  143.     while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4));
  144.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
  145.     switch(rate) {
  146.     case 0:
  147.         spiWriteRegData(DRATE, RATE_2_5);
  148.         break;
  149.     case 1:
  150.         spiWriteRegData(DRATE, RATE_10);
  151.         break;
  152.     default:
  153.         break;
  154.     }
  155.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
  156.     enableInterrupt();
  157. }
  158. /*
  159. *   功  能:實現屏蔽所有中斷函數
  160. */
  161. void disableInterrupt(void) {
  162.     __set_PRIMASK(1);
  163. }

  164. /*
  165. *   功  能:開啟全局中斷
  166. */
  167. void enableInterrupt(void) {
  168.     __set_PRIMASK(0);
  169. }
  170. /*
  171. *   功  能:實現外部中斷回調函數
  172. */
  173. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
  174.     int32_t sum = 0x00;
  175.     disableInterrupt();
  176.     if((GPIO_Pin == GPIO_PIN_4) && (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4) == GPIO_PIN_RESET)) {
  177.         //設置下次轉換的通道
  178.         spiWriteRegData(MUX, MUXP_AIN0 | MUXN_AINCOM);
  179.         HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
  180.         spiWriteByte(SYNC);     //發送同步命令
  181.         delayXus(5);
  182.         spiWriteByte(WAKEUP);   //發送喚醒命令
  183.         delayXus(5);            //延時一下
  184.         spiWriteByte(RDATA);    //發送讀數據命令
  185.         delayXus(25);
  186.         sum |= (spiReadByte() << 16);
  187.         sum |= (spiReadByte() << 8);
  188.         sum |= (spiReadByte());
  189.         HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
  190.         if(sum > 0x7fffff)
  191.             sum -= 0x1000000;
  192.         adcVaule = sum;
  193.         HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4);
  194.     }
  195.     enableInterrupt();
  196. }

  197. float filterlowerpass(float adc) {
  198.     //y(n) = qX(n)+(1-q)Y(n-1)
  199.     float filterVaule = 0;
  200.     static float adcold = 0;
  201.     filterVaule = 0.5 * adc + 0.5 * adcold;
  202.     adcold = adc;
  203.     return filterVaule;
  204. }

  205. float kalman_filter(float ADC_Value) {
  206.     float x_k1_k1, x_k_k1;
  207.     static float ADC_OLD_Value;
  208.     float Z_k;
  209.     static float P_k1_k1;

  210.     static float Q = 0.0001;
  211.     static float R = 5;
  212.     static float Kg = 0;
  213.     static float P_k_k1 = 1;

  214.     float kalman_adc;
  215.     static float kalman_adc_old = 0;
  216.     Z_k = ADC_Value;

  217.     if (abs(kalman_adc_old - ADC_Value) >= 10) {
  218.         x_k1_k1 = ADC_Value * 0.382 + kalman_adc_old * 0.618;
  219.     } else {
  220.         x_k1_k1 = kalman_adc_old;
  221.     }
  222.     x_k_k1 = x_k1_k1;
  223.     P_k_k1 = P_k1_k1 + Q;

  224.     Kg = P_k_k1 / (P_k_k1 + R);

  225.     kalman_adc = x_k_k1 + Kg * (Z_k - kalman_adc_old);
  226.     P_k1_k1 = (1 - Kg) * P_k_k1;
  227.     P_k_k1 = P_k1_k1;

  228.     ADC_OLD_Value = ADC_Value;
  229.     kalman_adc_old = kalman_adc;

  230.     return kalman_adc;
  231. }
復制代碼
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "main.h"
  3. #include "spi.h"
  4. #include "tim.h"
  5. #include "usart.h"
  6. #include "gpio.h"

  7. /* Private includes ----------------------------------------------------------*/
  8. /* USER CODE BEGIN Includes */
  9. #include "ads1256.h"
  10. /* USER CODE END Includes */

  11. /* Private typedef -----------------------------------------------------------*/
  12. /* USER CODE BEGIN PTD */

  13. /* USER CODE END PTD */

  14. /* Private define ------------------------------------------------------------*/
  15. /* USER CODE BEGIN PD */

  16. /* USER CODE END PD */

  17. /* Private macro -------------------------------------------------------------*/
  18. /* USER CODE BEGIN PM */

  19. /* USER CODE END PM */

  20. /* Private variables ---------------------------------------------------------*/

  21. /* USER CODE BEGIN PV */

  22. /* USER CODE END PV */

  23. /* Private function prototypes -----------------------------------------------*/
  24. void SystemClock_Config(void);
  25. /* USER CODE BEGIN PFP */

  26. /* USER CODE END PFP */

  27. /* Private user code ---------------------------------------------------------*/
  28. /* USER CODE BEGIN 0 */

  29. /* USER CODE END 0 */

  30. /**
  31.   * @brief  The application entry point.
  32.   * @retval int
  33.   */
  34. int main(void) {
  35.     /* USER CODE BEGIN 1 */

  36.     /* USER CODE END 1 */

  37.     /* MCU Configuration--------------------------------------------------------*/

  38.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  39.     HAL_Init();

  40.     /* USER CODE BEGIN Init */

  41.     /* USER CODE END Init */

  42.     /* Configure the system clock */
  43.     SystemClock_Config();

  44.     /* USER CODE BEGIN SysInit */

  45.     /* USER CODE END SysInit */

  46.     /* Initialize all configured peripherals */
  47.     MX_GPIO_Init();
  48.     MX_TIM6_Init();
  49.     MX_SPI1_Init();
  50.     MX_USART1_UART_Init();
  51.     /* USER CODE BEGIN 2 */
  52.     ads1256Init();
  53.     /* USER CODE END 2 */

  54.     /* Infinite loop */
  55.     /* USER CODE BEGIN WHILE */
  56.     while (1) {
  57.         /* USER CODE END WHILE */

  58.         /* USER CODE BEGIN 3 */
  59.         voltage = (float)(adcVaule * 5.0 / 8388607); //計算電壓
  60.         //filterVoltage = filterlowerpass(voltage);    //低通濾波
  61.                 filterVoltage2 = kalman_filter(voltage);                 //卡爾瑪濾波
  62.         //printf("voltage:%f\n\t", voltage);
  63.         //printf("filterVoltage:%f\n\t", filterVoltage2);
  64.         //HAL_Delay(5);
  65.     }
  66.     /* USER CODE END 3 */
  67. }

  68. /**
  69.   * @brief System Clock Configuration
  70.   * @retval None
  71.   */
  72. void SystemClock_Config(void) {
  73.     RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  74.     RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  75.     /** Initializes the CPU, AHB and APB busses clocks
  76.     */
  77.     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  78.     RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  79.     RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  80.     RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  81.     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  82.     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  83.     RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  84.     if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
  85.         Error_Handler();
  86.     }
  87.     /** Initializes the CPU, AHB and APB busses clocks
  88.     */
  89.     RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
  90.                                   | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  91.     RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  92.     RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  93.     RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  94.     RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  95.     if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
  96.         Error_Handler();
  97.     }
  98. }

  99. /* USER CODE BEGIN 4 */
  100. int fputc(int ch, FILE *f) {
  101.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 100);
  102.     return ch;
  103. }
  104. /* USER CODE END 4 */

  105. /**
  106.   * @brief  This function is executed in case of error occurrence.
  107.   * @retval None
  108.   */
  109. void Error_Handler(void) {
  110.     /* USER CODE BEGIN Error_Handler_Debug */
  111.     /* User can add his own implementation to report the HAL error return state */

  112.     /* USER CODE END Error_Handler_Debug */
  113. ……………………

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


所有資料51hei提供下載:
ADS1256_INT.7z (268.5 KB, 下載次數: 467)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:489675 發表于 2019-3-13 09:16 來自手機 | 只看該作者
好東西,用用
回復

使用道具 舉報

板凳
ID:489833 發表于 2019-3-13 12:04 | 只看該作者
感謝,試試看
回復

使用道具 舉報

地板
ID:98985 發表于 2019-4-17 12:49 | 只看該作者
謝謝分享,下載下來學習下
回復

使用道具 舉報

5#
ID:328263 發表于 2019-5-6 20:10 | 只看該作者
最近正好遇到中斷的問題,看看怎么樣
回復

使用道具 舉報

6#
ID:384522 發表于 2019-7-25 17:52 | 只看該作者
學習學習
回復

使用道具 舉報

7#
ID:689409 發表于 2020-2-29 16:46 | 只看該作者
嘗試HAL驅動ADS1256一直沒有成功,謝謝分享!
回復

使用道具 舉報

8#
ID:68875 發表于 2020-2-29 22:33 | 只看該作者
good,
回復

使用道具 舉報

9#
ID:491246 發表于 2020-4-19 10:02 | 只看該作者
謝謝分享!
回復

使用道具 舉報

10#
ID:260417 發表于 2020-7-16 13:32 | 只看該作者
感謝分享  驅動一直未成功
回復

使用道具 舉報

11#
ID:356526 發表于 2020-9-24 21:56 | 只看該作者
很棒的資料
回復

使用道具 舉報

12#
ID:875880 發表于 2021-1-13 22:23 | 只看該作者
很好的資料,已經下載。實驗下,作者很辛苦,寫的代碼直接對 iO操作,可移植性還是不強。
回復

使用道具 舉報

13#
ID:577974 發表于 2021-3-22 15:08 | 只看該作者
這份源碼可以使用嗎
回復

使用道具 舉報

14#
ID:653833 發表于 2021-3-28 20:32 | 只看該作者
怎么找不到io對應的端口吶
回復

使用道具 舉報

15#
ID:953850 發表于 2021-7-16 15:31 | 只看該作者
很好的資料。j就是要硬件SPI
回復

使用道具 舉報

16#
ID:954626 發表于 2021-7-23 10:42 | 只看該作者
這個好用嗎,為啥我用完數據只有零啊,不采集數據
回復

使用道具 舉報

17#
ID:956451 發表于 2021-7-26 15:19 | 只看該作者
請問如何接線
回復

使用道具 舉報

18#
ID:893692 發表于 2021-7-30 14:45 | 只看該作者
能用嗎?
回復

使用道具 舉報

19#
ID:165291 發表于 2021-10-2 01:43 來自手機 | 只看該作者
不知道可以移植濾波程序嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕日韩欧美一区二区三区 | 精品久久香蕉国产线看观看亚洲 | 日韩精品成人网 | 在线日韩欧美 | 国产色婷婷 | 欧美爱爱视频 | 久久久九九九九 | 久久精品一区二区 | 玖玖玖在线观看 | 在线色 | 美国十次成人欧美色导视频 | 九色视频网站 | 日韩一区二区在线视频 | 成人av播放 | 西西裸体做爰视频 | 81精品国产乱码久久久久久 | 在线免费黄色小视频 | 91在线第一页 | 欧美亚洲国产成人 | 日韩免费一区二区 | 91福利网| 亚洲欧美中文日韩在线v日本 | 国产精品色婷婷久久58 | 日韩在线观看中文字幕 | 久草热播 | 久久9视频 | 在线观看的av | 国产视频中文字幕在线观看 | 国产高清在线精品一区二区三区 | 亚洲精品视频网站在线观看 | 国产亚洲精品久久久久久豆腐 | 狠狠av | 香蕉久久久 | 国产一区二区三区在线 | 日本一卡精品视频免费 | 国产精品特级毛片一区二区三区 | 欧美日韩综合一区 | 欧洲视频一区二区 | 一区二区三区国产 | 欧美无乱码久久久免费午夜一区 | av黄色在线观看 |