久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32+LabVIEW的USB數據采集與顯示源程序
[打印本頁]
作者:
胡大
時間:
2019-7-18 11:30
標題:
STM32+LabVIEW的USB數據采集與顯示源程序
基于STM32和LabVIEW的USB數據采集與顯示
(Based STM32 USB data acquisition and LabVIEW display)
0.png
(35.78 KB, 下載次數: 60)
下載附件
2019-7-18 18:10 上傳
1、打開電腦的“控制面板” -->“字體”,把“數碼管字體”文件夾中的兩個文件,復制到“字體”中
2、重新打開labview,就可以在您的字體設置欄找到NI7SEG字體了
3、本labview采集程序采用了自動識別單片機串口技術,用戶不必手動選擇串口
4、旋動開發板上的可調電阻,可以看到ADC值在變化
5、本實驗的采樣率是:10/秒,即labview可以在100ms之內處理完一個數據。如果用戶的采樣率加大,請采用labview生產者/消費者結構
單片機源程序如下:
/*****************************************************************
*
* 文件名: main.c
* 內容簡述: 本程序演示了可調電阻(PC0)的ADC(非DMA)以及過采樣技術的使用
*
*
******************************************************************/
/* 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;
/*************************************************
函數: void RCC_Configuration(void)
功能: 復位和時鐘控制 配置
參數: 無
返回: 無
**************************************************/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus; //定義外部高速晶體啟動狀態枚舉變量
GPIO_InitTypeDef GPIO_InitStructure;
RCC_DeInit(); //復位RCC外部設備寄存器到默認值
RCC_HSEConfig(RCC_HSE_ON); //打開外部高速晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速時鐘準備好
if(HSEStartUpStatus == SUCCESS) //外部高速時鐘已經準別好
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法.位置:RCC初始化子函數里面,時鐘起振之后
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); //配置系統時鐘 = PLL時鐘
while(RCC_GetSYSCLKSource() != 0x08) //檢查PLL時鐘是否作為系統時鐘
{
}
}
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);
}
/*******************************************************************************
函數名: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, 用軟件自己觸發 */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作模式:獨立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //單通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //單次轉換
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //轉換由軟件而不是外部觸發啟動
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC1數據右對齊
ADC_InitStructure.ADC_NbrOfChannel = 1; //順序進行規則轉換的ADC通道的數目
ADC_Init(ADC1, &ADC_InitStructure); //根據ADC_InitStruct中指定的參數,初始化外設ADC1的寄存器
/* ADC1 regular channel10 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5); //ADC1,ADC通道10,規則采樣順序值為1,采樣時間為239.5周期
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE); //使能ADC1
/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1); //重置ADC1的校準寄存器
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1)); //獲取ADC1重置校準寄存器的狀態,設置狀態則等待
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1); //開始ADC1的校準狀態
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1)); //等待校準完成
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1的軟件轉換啟動功能
}
/*************************************************
函數: void Timer2_Configuration(void)
功能: TIM2 配置
參數: 無
返回: 無
定時計算:(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寄存器重設為缺省值
TIM_TimeBaseStructure.TIM_Period = 781; //自動重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler=36 - 1; //TIMx 時鐘頻率除數的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采樣分頻
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數模式
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); //中斷分組設置
//配置TIM2中斷
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //指定搶占式優先級別0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //指定響應優先級別0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能TIM2中斷
NVIC_Init(&NVIC_InitStructure);
}
/*************************************************
函數: void TIM2_IRQHandler(void)
功能: TIM2中斷處理函數
參數: 無
返回: 無
說明:390.5us中斷1次
**************************************************/
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中斷標志
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) //上位機自動查找采集器是否在線
{
comm = 0;
USART_To_USB_Send_Data(0x63); //發送CP的ASCII碼
USART_To_USB_Send_Data(0x70);
}
if (comm == 0x7a) //單片機發送數據給PC機
{
for(i = 0;i < 256;i++) //根據過采樣技術,每提高一位AD分辨率,需要增加4倍的采樣率;從12位AD分辨率增加到16位AD分辨率,即增加4位,所以需要增加256倍的采樣率
{
gototime = 0;
TIM_Cmd(TIM2, ENABLE); //開啟時鐘
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //軟件啟動ADC轉換
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待轉換結束
ad = 0;
ad = ADC_GetConversionValue(ADC1); //讀取ADC值
tempu32 += ad; //累加
while(gototime == 0); //延時:390.5us。采樣率:10/秒
TIM_Cmd(TIM2, DISABLE); //關閉時鐘
}
//以下數據處理和發送會占用一定的時間,如果我們不采用過采樣技術,可以把以下代碼放在TIM2定時之內處理
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;
}
}
}
}
復制代碼
0.png
(7.51 KB, 下載次數: 58)
下載附件
2019-7-18 18:11 上傳
所有資料51hei提供下載:
69491704Based-STM32-USB-data-acquisition.rar
(1.7 MB, 下載次數: 201)
2019-7-18 11:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
cr8526
時間:
2019-7-23 00:32
是不是要編Labview和單片機的程序啊?
作者:
ben0148
時間:
2020-1-20 09:10
謝謝分享!!
作者:
GOLD焱
時間:
2021-4-4 12:40
謝謝樓主分享,感覺很有用
作者:
newepson2001
時間:
2021-4-24 09:07
謝謝分享,下來好好學習學習
作者:
chenqingbo1988
時間:
2021-7-7 08:37
謝謝分享,下載下來好好學習
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日本国产精品视频
|
亚洲福利av
|
国产a区
|
国产成人高清视频
|
青青草综合
|
91成人在线
|
久久免费视频2
|
日本又色又爽又黄又高潮
|
福利视频一区二区三区
|
在线观看视频你懂得
|
毛片视频免费观看
|
亚洲a视频
|
国产精品久久久免费
|
亚洲人成人一区二区在线观看
|
亚洲国产精品久久久久婷婷老年
|
精品欧美乱码久久久久久1区2区
|
h视频免费观看
|
男人电影天堂
|
我爱操
|
欧美在线观看一区
|
免费的av网站
|
亚洲一区视频在线
|
久久国产精品色av免费观看
|
国产一区二区电影
|
天天插天天操
|
欧美色999
|
欧美999
|
99精品久久
|
91精品一区二区三区久久久久
|
日韩精品在线免费观看视频
|
精品欧美一区二区在线观看欧美熟
|
九九热在线视频
|
欧美高清性xxxxhd
|
亚洲成人日韩
|
日本在线视频一区二区
|
久久久久国产视频
|
日韩影院在线观看
|
欧美精品一区二区三区蜜桃视频
|
在线成人
|
欧美极品在线视频
|
成人小视频在线观看
|