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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7870|回復(fù): 5
收起左側(cè)

STM32+LabVIEW的USB數(shù)據(jù)采集與顯示源程序

  [復(fù)制鏈接]
ID:585986 發(fā)表于 2019-7-18 11:30 | 顯示全部樓層 |閱讀模式
基于STM32和LabVIEW的USB數(shù)據(jù)采集與顯示
(Based STM32 USB data acquisition and LabVIEW display)
0.png
1、打開電腦的“控制面板” -->“字體”,把“數(shù)碼管字體”文件夾中的兩個文件,復(fù)制到“字體”中

2、重新打開labview,就可以在您的字體設(shè)置欄找到NI7SEG字體了

3、本labview采集程序采用了自動識別單片機(jī)串口技術(shù),用戶不必手動選擇串口

4、旋動開發(fā)板上的可調(diào)電阻,可以看到ADC值在變化

5、本實(shí)驗(yàn)的采樣率是:10/秒,即labview可以在100ms之內(nèi)處理完一個數(shù)據(jù)。如果用戶的采樣率加大,請采用labview生產(chǎn)者/消費(fèi)者結(jié)構(gòu)

單片機(jī)源程序如下:
  1. /*****************************************************************
  2. *
  3. * 文件名: main.c
  4. * 內(nèi)容簡述: 本程序演示了可調(diào)電阻(PC0)的ADC(非DMA)以及過采樣技術(shù)的使用
  5. *
  6. *
  7. ******************************************************************/

  8. /* Includes ------------------------------------------------------------------*/
  9. #include "stm32f10x.h"
  10. #include "usb_lib.h"
  11. #include "usb_desc.h"
  12. #include "hw_config.h"
  13. #include "usb_pwr.h"
  14. #include "stm32f10x_tim.h"
  15. #include "platform_config.h"

  16. u8 comm = 0;
  17. u8 ah,al;
  18. u16 ad;
  19. u32 tempu32 = 0;

  20. u8 gototime = 0;

  21. /*************************************************
  22. 函數(shù): void RCC_Configuration(void)
  23. 功能: 復(fù)位和時鐘控制 配置
  24. 參數(shù): 無
  25. 返回: 無
  26. **************************************************/
  27. void RCC_Configuration(void)
  28. {
  29.   ErrorStatus HSEStartUpStatus;                    //定義外部高速晶體啟動狀態(tài)枚舉變量
  30.   GPIO_InitTypeDef GPIO_InitStructure;

  31.   RCC_DeInit();                                    //復(fù)位RCC外部設(shè)備寄存器到默認(rèn)值
  32.   RCC_HSEConfig(RCC_HSE_ON);                       //打開外部高速晶振
  33.   HSEStartUpStatus = RCC_WaitForHSEStartUp();      //等待外部高速時鐘準(zhǔn)備好
  34.   if(HSEStartUpStatus == SUCCESS)                  //外部高速時鐘已經(jīng)準(zhǔn)別好
  35.   {
  36.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預(yù)讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法.位置:RCC初始化子函數(shù)里面,時鐘起振之后
  37.     FLASH_SetLatency(FLASH_Latency_2);                    //flash操作的延時
  38.              
  39.     RCC_HCLKConfig(RCC_SYSCLK_Div1);               //配置AHB(HCLK)時鐘等于==SYSCLK
  40.     RCC_PCLK2Config(RCC_HCLK_Div1);                //配置APB2(PCLK2)鐘==AHB時鐘
  41.     RCC_PCLK1Config(RCC_HCLK_Div2);                //配置APB1(PCLK1)鐘==AHB1/2時鐘
  42.          
  43.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //配置PLL時鐘 == 外部高速晶體時鐘 * 9 = 72MHz
  44.     RCC_PLLCmd(ENABLE);                                   //使能PLL時鐘
  45.    
  46.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)    //等待PLL時鐘就緒
  47.     {
  48.     }
  49.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);            //配置系統(tǒng)時鐘 = PLL時鐘
  50.     while(RCC_GetSYSCLKSource() != 0x08)                  //檢查PLL時鐘是否作為系統(tǒng)時鐘
  51.     {
  52.     }
  53.   }
  54.   
  55.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);    //允許AFIO時鐘

  56.   /* Enable USB_DISCONNECT GPIO clock */
  57.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE);

  58.   /* Configure USB pull-up pin */
  59.   GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;
  60.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  61.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  62.   GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);
  63. }

  64. /*******************************************************************************
  65.         函數(shù)名:ADC_Configuration
  66.         輸  入:
  67.         輸  出:
  68.         功能說明:配置ADC, PC0
  69. */
  70. static void ADC_Configuration(void)
  71. {
  72.         GPIO_InitTypeDef GPIO_InitStructure;
  73.         ADC_InitTypeDef ADC_InitStructure;
  74.         volatile u16 ADCConvertedValue;

  75.     /* 使能 ADC1 and GPIOC clock */
  76.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
  77.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);              //72M/6=12,ADC最大時間不能超過14M

  78.         /* 配置PC0為模擬輸入(ADC Channel10) */
  79.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  80.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  81.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  82.         /* 配置ADC1, 不用DMA, 用軟件自己觸發(fā) */
  83.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                 //ADC1工作模式:獨(dú)立模式
  84.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;                         //單通道模式
  85.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                 //單次轉(zhuǎn)換
  86.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;          //轉(zhuǎn)換由軟件而不是外部觸發(fā)啟動
  87.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;         //ADC1數(shù)據(jù)右對齊
  88.         ADC_InitStructure.ADC_NbrOfChannel = 1;           //順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目
  89.         ADC_Init(ADC1, &ADC_InitStructure);                   //根據(jù)ADC_InitStruct中指定的參數(shù),初始化外設(shè)ADC1的寄存器

  90.         /* ADC1 regular channel10 configuration */
  91.         ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5);        //ADC1,ADC通道10,規(guī)則采樣順序值為1,采樣時間為239.5周期

  92.         /* Enable ADC1 */
  93.         ADC_Cmd(ADC1, ENABLE);                  //使能ADC1

  94.         /* Enable ADC1 reset calibaration register */
  95.         ADC_ResetCalibration(ADC1);                                                //重置ADC1的校準(zhǔn)寄存器
  96.         /* Check the end of ADC1 reset calibration register */
  97.         while(ADC_GetResetCalibrationStatus(ADC1));                //獲取ADC1重置校準(zhǔn)寄存器的狀態(tài),設(shè)置狀態(tài)則等待

  98.         /* Start ADC1 calibaration */
  99.         ADC_StartCalibration(ADC1);                                        //開始ADC1的校準(zhǔn)狀態(tài)
  100.         /* Check the end of ADC1 calibration */
  101.         while(ADC_GetCalibrationStatus(ADC1));                //等待校準(zhǔn)完成

  102.         /* Start ADC1 Software Conversion */
  103.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能ADC1的軟件轉(zhuǎn)換啟動功能
  104. }

  105. /*************************************************
  106. 函數(shù): void Timer2_Configuration(void)
  107. 功能: TIM2 配置
  108. 參數(shù): 無
  109. 返回: 無
  110. 定時計(jì)算:(1 /(72 / (36 - 1 + 1))) * 781 us = 390.5us
  111. **************************************************/
  112. void Timer2_Configuration(void)
  113. {
  114.   TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  115.    
  116.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);            //打開TIM2定時器的時鐘
  117.   
  118.   
  119.   TIM_DeInit(TIM2);                                                    //TIMx寄存器重設(shè)為缺省值
  120.   
  121.   TIM_TimeBaseStructure.TIM_Period = 781;                            //自動重裝載寄存器周期的值
  122.   TIM_TimeBaseStructure.TIM_Prescaler=36 - 1;               //TIMx 時鐘頻率除數(shù)的預(yù)分頻值
  123.   TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;     //采樣分頻
  124.   TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計(jì)數(shù)模式
  125.   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  126.   
  127.   TIM_ARRPreloadConfig(TIM2, ENABLE);                       //允許自動重裝載寄存器(ARR)
  128.   TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);                        //允許TIM2溢出中斷
  129.   
  130.   TIM_Cmd(TIM2, ENABLE);                                        //開啟時鐘
  131. }

  132. /*******************************************************************************
  133. * Function Name   : NVIC_Configuration
  134. * Description        : Configures NVIC and Vector Table base location.
  135. * Input                    : None
  136. * Output                 : None
  137. * Return                 : None
  138. *******************************************************************************/
  139. void NVIC_Configuration(void)
  140. {
  141.    NVIC_InitTypeDef NVIC_InitStructure;
  142.   
  143.    /* Set the Vector Table base location at 0x08000000 */
  144.    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  145.   
  146.    /* Configure the NVIC Preemption Priority Bits */  
  147.    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                                 //中斷分組設(shè)置

  148.   //配置TIM2中斷
  149.   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  150.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                 //指定搶占式優(yōu)先級別0
  151.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                         //指定響應(yīng)優(yōu)先級別0
  152.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                 //使能TIM2中斷
  153.   NVIC_Init(&NVIC_InitStructure);
  154. }

  155. /*************************************************
  156. 函數(shù): void TIM2_IRQHandler(void)
  157. 功能: TIM2中斷處理函數(shù)
  158. 參數(shù): 無
  159. 返回: 無
  160. 說明:390.5us中斷1次
  161. **************************************************/
  162. void TIM2_IRQHandler(void)
  163. {
  164.    if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
  165.    {      
  166.       TIM_ClearITPendingBit(TIM2,TIM_IT_Update);         //清除中斷標(biāo)志
  167.       gototime = 1;
  168.    }
  169. }

  170. /*******************************************************************************
  171. * Function Name  : main.
  172. * Description    : Main routine.
  173. * Input          : None.
  174. * Output         : None.
  175. * Return         : None.
  176. *******************************************************************************/
  177. int main(void)
  178. {
  179.   u16 i;

  180.   RCC_Configuration();
  181.   ADC_Configuration();
  182.   NVIC_Configuration();
  183.   Timer2_Configuration();

  184.   Set_USBClock();
  185.   USB_Interrupts_Config();
  186.   USB_Init();

  187.   while (1)
  188.   {
  189.     if (bDeviceState == CONFIGURED)  
  190.     {
  191.           if (comm == 0x63)                    //上位機(jī)自動查找采集器是否在線
  192.           {                         
  193.             comm = 0;      
  194.         USART_To_USB_Send_Data(0x63);      //發(fā)送CP的ASCII碼
  195.         USART_To_USB_Send_Data(0x70);                                                                 
  196.           }
  197.       if (comm == 0x7a)                             //單片機(jī)發(fā)送數(shù)據(jù)給PC機(jī)
  198.           {      
  199.         for(i = 0;i < 256;i++)                      //根據(jù)過采樣技術(shù),每提高一位AD分辨率,需要增加4倍的采樣率;從12位AD分辨率增加到16位AD分辨率,即增加4位,所以需要增加256倍的采樣率
  200.         {
  201.           gototime = 0;
  202.           TIM_Cmd(TIM2, ENABLE);                                //開啟時鐘
  203.               ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //軟件啟動ADC轉(zhuǎn)換
  204.               while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));   //等待轉(zhuǎn)換結(jié)束
  205.               ad = 0;
  206.                   ad = ADC_GetConversionValue(ADC1);                        //讀取ADC值                     
  207.           tempu32 += ad;                                          //累加        
  208.           while(gototime == 0);                                                    //延時:390.5us。采樣率:10/秒
  209.           TIM_Cmd(TIM2, DISABLE);                                //關(guān)閉時鐘
  210.         }

  211.           //以下數(shù)據(jù)處理和發(fā)送會占用一定的時間,如果我們不采用過采樣技術(shù),可以把以下代碼放在TIM2定時之內(nèi)處理                            
  212.         ad = tempu32 >> 4;                 //16位分辨率,累加值右移4位
  213.         ah = ad >> 8;                                           //高8位
  214.         al = ad & 0xff;                              //低8位
  215.         USART_To_USB_Send_Data(ah);                                          
  216.         USART_To_USB_Send_Data(al);
  217.                             
  218.         tempu32 = 0;   
  219.       }
  220.     }                      
  221.   }
  222. }
復(fù)制代碼
0.png
所有資料51hei提供下載:
69491704Based-STM32-USB-data-acquisition.rar (1.7 MB, 下載次數(shù): 201)

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:373684 發(fā)表于 2019-7-23 00:32 | 顯示全部樓層
是不是要編Labview和單片機(jī)的程序啊?
回復(fù)

使用道具 舉報

ID:544005 發(fā)表于 2020-1-20 09:10 | 顯示全部樓層
謝謝分享!!
回復(fù)

使用道具 舉報

ID:523997 發(fā)表于 2021-4-4 12:40 | 顯示全部樓層
謝謝樓主分享,感覺很有用
回復(fù)

使用道具 舉報

ID:77126 發(fā)表于 2021-4-24 09:07 | 顯示全部樓層
謝謝分享,下來好好學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:358642 發(fā)表于 2021-7-7 08:37 | 顯示全部樓層
謝謝分享,下載下來好好學(xué)習(xí)
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品久久香蕉国产线看观看亚洲 | 99热播精品| 成人一级片在线观看 | caoporn免费| 不卡一区二区三区四区 | 久久久精品一区二区三区 | 伊人久麻豆社区 | 国产黄色大片在线观看 | 麻豆天堂| 丝袜天堂| 亚洲成a人片 | 看羞羞视频 | 日韩一级 | 一区二区国产精品 | 福利视频二区 | 日韩一区二区免费视频 | 国产免费看 | av天天操 | 欧美精品一区二区三区在线 | 免费午夜剧场 | 久久黄网 | 国产一级淫片a直接免费看 免费a网站 | 91porn国产成人福利 | 二区三区av | av一二三区| 免费在线h视频 | 91.com视频| 在线天堂免费中文字幕视频 | 色免费在线视频 | 日本黄色片免费在线观看 | 成人久久18免费网站麻豆 | 国产成人影院 | 免费观看黄色一级片 | 天天拍天天射 | 日本三级全黄三级a | 91精品国产自产精品男人的天堂 | 五月婷婷在线视频 | 操一草| 亚洲精品乱码久久久久久按摩 | 九九免费在线视频 | 国产一区二区三区视频在线观看 |