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

標題: STM32實現(xiàn)ADS1256進行數(shù)據(jù)電壓采集程序 [打印本頁]

作者: 大笨鐘361    時間: 2019-3-12 15:53
標題: STM32實現(xiàn)ADS1256進行數(shù)據(jù)電壓采集程序
通過cubeMX配置STM32RCT6的IO口與ads1256ADC模塊的連接IO口工作模式SPI,還有接受中斷接受狀態(tài)引腳,最終ADC采集數(shù)據(jù)經(jīng)過卡爾曼濾波器濾波輸出,詳情請見附件

單片機源程序如下:
  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.     //設(shè)置定時器的計數(shù)值
  9.     __HAL_TIM_SET_COUNTER(&htim6, diff);
  10.     //啟動定時器計數(shù)
  11.     HAL_TIM_Base_Start(&htim6);
  12.     //判定計數(shù)結(jié)束
  13.     while(diff < 0xffff - 5) {
  14.         diff = __HAL_TIM_GET_COUNTER(&htim6);
  15.     }
  16.     //延時完成關(guān)閉定時器計數(shù)
  17.     HAL_TIM_Base_Stop(&htim6);
  18. }

  19. /*
  20. *   功  能:實現(xiàn)SPI協(xié)議總線發(fā)送一個字節(jié)的數(shù)據(jù)信息
  21. *   參  數(shù):待發(fā)送的數(shù)據(jù)信息
  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. *   功  能:實現(xiàn)SPI協(xié)議總監(jiān)接受一個字節(jié)的數(shù)據(jù)信息
  30. *   參  數(shù):無
  31. *   返回值:接受到的數(shù)據(jù)信息
  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寄存器中寫入一個字節(jié)的數(shù)據(jù)
  41. *   參  數(shù):regAdd寄存器地址 regData待寫入的數(shù)據(jù)信息
  42. *   返回值:無
  43. */
  44. void spiWriteRegData(uint8_t regAdd, uint8_t regData) {
  45.     //拉低SPI協(xié)議的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.     //寫入即將寫入數(shù)據(jù)的個數(shù)
  52.     spiWriteByte(0x00);
  53.     //寫入數(shù)據(jù)信息
  54.     spiWriteByte(regData);
  55.     //拉高SPI協(xié)議的CS引腳
  56.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
  57. }

  58. /*
  59. *   功  能:初始化ads1256
  60. *   參  數(shù):無
  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.     //設(shè)置ads1256的狀態(tài)寄存器
  72.     spiWriteRegData(STATUS, 0x06);      //數(shù)據(jù)發(fā)送高位在前 自動校準 啟用buf
  73.     spiWriteRegData(MUX, MUXP_AIN0 | MUXN_AIN1); //單端模式
  74.     //設(shè)置ads1256的增益
  75.     spiWriteRegData(ADCON, GAIN_1);
  76.     //設(shè)置ads采樣速率
  77.     spiWriteRegData(DRATE, RATE_30000);
  78.     //設(shè)置IO狀態(tài)
  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中讀取出相關(guān)數(shù)據(jù)信息
  90. *   參  數(shù):下一次轉(zhuǎn)換通道
  91. *   返回值:讀取到的數(shù)據(jù)信息
  92. */
  93. int32_t ads1256ReadValue(uint8_t channel) {
  94.     int32_t sum = 0;
  95.     //等待準備好信號變低
  96.     while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4));
  97.     //設(shè)置下次轉(zhuǎn)換的通道
  98.     spiWriteRegData(MUX, channel);

  99.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
  100.     spiWriteByte(SYNC);     //發(fā)送同步命令
  101.     delayXus(5);
  102.     spiWriteByte(WAKEUP);   //發(fā)送喚醒命令
  103.     delayXus(5);            //延時一下
  104.     spiWriteByte(RDATA);    //發(fā)送讀數(shù)據(jù)命令
  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采集數(shù)據(jù):%0x,%f\n", adcVaule, voltage);
  115.     HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4);
  116.     return sum;
  117. }
  118. /*
  119. *   功  能:實現(xiàn)ads的增益設(shè)置
  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. *   功  能:設(shè)置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. *   功  能:實現(xiàn)屏蔽所有中斷函數(shù)
  160. */
  161. void disableInterrupt(void) {
  162.     __set_PRIMASK(1);
  163. }

  164. /*
  165. *   功  能:開啟全局中斷
  166. */
  167. void enableInterrupt(void) {
  168.     __set_PRIMASK(0);
  169. }
  170. /*
  171. *   功  能:實現(xiàn)外部中斷回調(diào)函數(shù)
  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.         //設(shè)置下次轉(zhuǎn)換的通道
  178.         spiWriteRegData(MUX, MUXP_AIN0 | MUXN_AINCOM);
  179.         HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
  180.         spiWriteByte(SYNC);     //發(fā)送同步命令
  181.         delayXus(5);
  182.         spiWriteByte(WAKEUP);   //發(fā)送喚醒命令
  183.         delayXus(5);            //延時一下
  184.         spiWriteByte(RDATA);    //發(fā)送讀數(shù)據(jù)命令
  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. }
復(fù)制代碼
  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黑下載附件…………
復(fù)制代碼


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



作者: hylinzhi    時間: 2019-3-13 09:16
好東西,用用
作者: ds1998    時間: 2019-3-13 12:04
感謝,試試看
作者: yyjzd0414    時間: 2019-4-17 12:49
謝謝分享,下載下來學習下
作者: GuTouii    時間: 2019-5-6 20:10
最近正好遇到中斷的問題,看看怎么樣
作者: H823603932    時間: 2019-7-25 17:52
學習學習
作者: icanfly0000    時間: 2020-2-29 16:46
嘗試HAL驅(qū)動ADS1256一直沒有成功,謝謝分享!
作者: cnc2020    時間: 2020-2-29 22:33
good,
作者: mcuee    時間: 2020-4-19 10:02
謝謝分享!
作者: ZHAOMINGHUA    時間: 2020-7-16 13:32
感謝分享  驅(qū)動一直未成功
作者: 25Hzzz    時間: 2020-9-24 21:56
很棒的資料
作者: zhouyg    時間: 2021-1-13 22:23
很好的資料,已經(jīng)下載。實驗下,作者很辛苦,寫的代碼直接對 iO操作,可移植性還是不強。

作者: fenfafei    時間: 2021-3-22 15:08
這份源碼可以使用嗎
作者: 源稚雨    時間: 2021-3-28 20:32
怎么找不到io對應(yīng)的端口吶

作者: Lin_sudo    時間: 2021-7-16 15:31
很好的資料。j就是要硬件SPI
作者: yhx'    時間: 2021-7-23 10:42
這個好用嗎,為啥我用完數(shù)據(jù)只有零啊,不采集數(shù)據(jù)

作者: 多和人    時間: 2021-7-26 15:19
請問如何接線
作者: m24    時間: 2021-7-30 14:45
能用嗎?
作者: timeabcd    時間: 2021-10-2 01:43
不知道可以移植濾波程序嗎?




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产亚洲精品成人av久久ww | 欧美激情国产精品 | 欧美日韩不卡 | 欧美精品一区二区免费 | 操视频网站 | 日韩成人 | 免费成人高清在线视频 | 亚洲精品日韩一区二区电影 | 丁香色婷婷 | 国产精品免费观看视频 | 夜夜爽夜夜操 | 91亚洲精品在线观看 | 91免费视频观看 | 色男人的天堂 | 91视频精选 | 91视在线国内在线播放酒店 | 欧美日韩在线免费观看 | 在线观看成人 | 精品一区av| 精品一级电影 | 欧美人妇做爰xxxⅹ性高电影 | caoporn国产精品免费公开 | 99久久精品免费看国产高清 | av国产在线观看 | 国产精品久久久久久网站 | 久久人爽| 久久国产精品一区二区三区 | 欧美日本高清 | 国产一区| 久久国产精彩视频 | 亚洲三级国产 | 亚洲一区二区三区四区五区午夜 | 国产免费一区二区 | 国产精品一区在线观看 | 在线观看成人小视频 | 九九视频在线观看视频6 | 欧美一区二区网站 | 久久精品在线免费视频 | 国产性生活一级片 | 日本三级网址 | 亚洲网一区 |