|
基于STM32和LabVIEW的USB數(shù)據(jù)采集與顯示
(Based STM32 USB data acquisition and LabVIEW display)
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ī)源程序如下:
- /*****************************************************************
- *
- * 文件名: main.c
- * 內(nèi)容簡述: 本程序演示了可調(diào)電阻(PC0)的ADC(非DMA)以及過采樣技術(shù)的使用
- *
- *
- ******************************************************************/
- /* Includes ------------------------------------------------------------------*/
- #include "stm32f10x.h"
- #include "usb_lib.h"
- #include "usb_desc.h"
- #include "hw_config.h"
- #include "usb_pwr.h"
- #include "stm32f10x_tim.h"
- #include "platform_config.h"
- u8 comm = 0;
- u8 ah,al;
- u16 ad;
- u32 tempu32 = 0;
- u8 gototime = 0;
- /*************************************************
- 函數(shù): void RCC_Configuration(void)
- 功能: 復(fù)位和時鐘控制 配置
- 參數(shù): 無
- 返回: 無
- **************************************************/
- void RCC_Configuration(void)
- {
- ErrorStatus HSEStartUpStatus; //定義外部高速晶體啟動狀態(tài)枚舉變量
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_DeInit(); //復(fù)位RCC外部設(shè)備寄存器到默認(rèn)值
- RCC_HSEConfig(RCC_HSE_ON); //打開外部高速晶振
- HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速時鐘準(zhǔn)備好
- if(HSEStartUpStatus == SUCCESS) //外部高速時鐘已經(jīng)準(zhǔn)別好
- {
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預(yù)讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法.位置:RCC初始化子函數(shù)里面,時鐘起振之后
- FLASH_SetLatency(FLASH_Latency_2); //flash操作的延時
-
- RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)時鐘等于==SYSCLK
- RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)鐘==AHB時鐘
- RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)鐘==AHB1/2時鐘
-
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL時鐘 == 外部高速晶體時鐘 * 9 = 72MHz
- RCC_PLLCmd(ENABLE); //使能PLL時鐘
-
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL時鐘就緒
- {
- }
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系統(tǒng)時鐘 = PLL時鐘
- while(RCC_GetSYSCLKSource() != 0x08) //檢查PLL時鐘是否作為系統(tǒng)時鐘
- {
- }
- }
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //允許AFIO時鐘
- /* Enable USB_DISCONNECT GPIO clock */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE);
- /* Configure USB pull-up pin */
- GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
- GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);
- }
- /*******************************************************************************
- 函數(shù)名:ADC_Configuration
- 輸 入:
- 輸 出:
- 功能說明:配置ADC, PC0
- */
- static void ADC_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- ADC_InitTypeDef ADC_InitStructure;
- volatile u16 ADCConvertedValue;
- /* 使能 ADC1 and GPIOC clock */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
- RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大時間不能超過14M
- /* 配置PC0為模擬輸入(ADC Channel10) */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- /* 配置ADC1, 不用DMA, 用軟件自己觸發(fā) */
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作模式:獨(dú)立模式
- ADC_InitStructure.ADC_ScanConvMode = DISABLE; //單通道模式
- ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //單次轉(zhuǎn)換
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //轉(zhuǎn)換由軟件而不是外部觸發(fā)啟動
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC1數(shù)據(jù)右對齊
- ADC_InitStructure.ADC_NbrOfChannel = 1; //順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目
- ADC_Init(ADC1, &ADC_InitStructure); //根據(jù)ADC_InitStruct中指定的參數(shù),初始化外設(shè)ADC1的寄存器
- /* ADC1 regular channel10 configuration */
- ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5); //ADC1,ADC通道10,規(guī)則采樣順序值為1,采樣時間為239.5周期
- /* Enable ADC1 */
- ADC_Cmd(ADC1, ENABLE); //使能ADC1
- /* Enable ADC1 reset calibaration register */
- ADC_ResetCalibration(ADC1); //重置ADC1的校準(zhǔn)寄存器
- /* Check the end of ADC1 reset calibration register */
- while(ADC_GetResetCalibrationStatus(ADC1)); //獲取ADC1重置校準(zhǔn)寄存器的狀態(tài),設(shè)置狀態(tài)則等待
- /* Start ADC1 calibaration */
- ADC_StartCalibration(ADC1); //開始ADC1的校準(zhǔn)狀態(tài)
- /* Check the end of ADC1 calibration */
- while(ADC_GetCalibrationStatus(ADC1)); //等待校準(zhǔn)完成
- /* Start ADC1 Software Conversion */
- ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1的軟件轉(zhuǎn)換啟動功能
- }
- /*************************************************
- 函數(shù): void Timer2_Configuration(void)
- 功能: TIM2 配置
- 參數(shù): 無
- 返回: 無
- 定時計(jì)算:(1 /(72 / (36 - 1 + 1))) * 781 us = 390.5us
- **************************************************/
- void Timer2_Configuration(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //打開TIM2定時器的時鐘
-
-
- TIM_DeInit(TIM2); //TIMx寄存器重設(shè)為缺省值
-
- TIM_TimeBaseStructure.TIM_Period = 781; //自動重裝載寄存器周期的值
- TIM_TimeBaseStructure.TIM_Prescaler=36 - 1; //TIMx 時鐘頻率除數(shù)的預(yù)分頻值
- TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采樣分頻
- TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計(jì)數(shù)模式
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
-
- TIM_ARRPreloadConfig(TIM2, ENABLE); //允許自動重裝載寄存器(ARR)
- TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //允許TIM2溢出中斷
-
- TIM_Cmd(TIM2, ENABLE); //開啟時鐘
- }
- /*******************************************************************************
- * Function Name : NVIC_Configuration
- * Description : Configures NVIC and Vector Table base location.
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- /* Set the Vector Table base location at 0x08000000 */
- NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
-
- /* Configure the NVIC Preemption Priority Bits */
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //中斷分組設(shè)置
- //配置TIM2中斷
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //指定搶占式優(yōu)先級別0
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //指定響應(yīng)優(yōu)先級別0
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能TIM2中斷
- NVIC_Init(&NVIC_InitStructure);
- }
- /*************************************************
- 函數(shù): void TIM2_IRQHandler(void)
- 功能: TIM2中斷處理函數(shù)
- 參數(shù): 無
- 返回: 無
- 說明:390.5us中斷1次
- **************************************************/
- void TIM2_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
- {
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中斷標(biāo)志
- gototime = 1;
- }
- }
- /*******************************************************************************
- * Function Name : main.
- * Description : Main routine.
- * Input : None.
- * Output : None.
- * Return : None.
- *******************************************************************************/
- int main(void)
- {
- u16 i;
- RCC_Configuration();
- ADC_Configuration();
- NVIC_Configuration();
- Timer2_Configuration();
- Set_USBClock();
- USB_Interrupts_Config();
- USB_Init();
- while (1)
- {
- if (bDeviceState == CONFIGURED)
- {
- if (comm == 0x63) //上位機(jī)自動查找采集器是否在線
- {
- comm = 0;
- USART_To_USB_Send_Data(0x63); //發(fā)送CP的ASCII碼
- USART_To_USB_Send_Data(0x70);
- }
- if (comm == 0x7a) //單片機(jī)發(fā)送數(shù)據(jù)給PC機(jī)
- {
- for(i = 0;i < 256;i++) //根據(jù)過采樣技術(shù),每提高一位AD分辨率,需要增加4倍的采樣率;從12位AD分辨率增加到16位AD分辨率,即增加4位,所以需要增加256倍的采樣率
- {
- gototime = 0;
- TIM_Cmd(TIM2, ENABLE); //開啟時鐘
- ADC_SoftwareStartConvCmd(ADC1, ENABLE); //軟件啟動ADC轉(zhuǎn)換
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待轉(zhuǎn)換結(jié)束
- ad = 0;
- ad = ADC_GetConversionValue(ADC1); //讀取ADC值
- tempu32 += ad; //累加
- while(gototime == 0); //延時:390.5us。采樣率:10/秒
- TIM_Cmd(TIM2, DISABLE); //關(guān)閉時鐘
- }
- //以下數(shù)據(jù)處理和發(fā)送會占用一定的時間,如果我們不采用過采樣技術(shù),可以把以下代碼放在TIM2定時之內(nèi)處理
- ad = tempu32 >> 4; //16位分辨率,累加值右移4位
- ah = ad >> 8; //高8位
- al = ad & 0xff; //低8位
- USART_To_USB_Send_Data(ah);
- USART_To_USB_Send_Data(al);
-
- tempu32 = 0;
- }
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
69491704Based-STM32-USB-data-acquisition.rar
(1.7 MB, 下載次數(shù): 201)
2019-7-18 11:29 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|