0.jpg (51.13 KB, 下載次數: 76)
下載附件
2019-7-18 02:40 上傳
1、打開電腦的“控制面板” -->“字體”,把“數碼管字體”文件夾中的兩個文件,復制到“字體”中
2、重新打開main.vi,就可以在您的字體設置欄找到NI7SEG字體了
3、本labview采集程序采用了自動識別單片機串口技術,用戶不必手動選擇串口
4、本程序可以測量STM32芯片內部的溫度。如果您用手按住開發板上的STM32芯片,可以看到labview上顯示的溫度在增加
5、本實驗的采樣率是:10/秒,即labview可以在100ms之內處理完一個數據。如果用戶的采樣率加大,請采用labview生產者/消費者結構
單片機源程序如下:
- /*****************************************************************
- *
- * 文件名: main.c
- * 內容簡述: 本程序演示了STM32內部溫度傳感器的ADC(非DMA)以及過采樣技術的使用
- 采用RS485通信方式。可使用RS232轉RS485轉換器,PC機上的LabVIEW上位機仍然是串口方式,不需改動
- *
- *
- ******************************************************************/
- #include "stm32f10x.h"
- #include <stdio.h>
- u8 ah,al,comm = 0;
- u16 ad;
- u32 tempu32 = 0;
- u8 gototime = 0;
- /*************************************************
- 函數: void RCC_Configuration(void)
- 功能: 復位和時鐘控制 配置
- 參數: 無
- 返回: 無
- **************************************************/
- void RCC_Configuration(void)
- {
- ErrorStatus HSEStartUpStatus; //定義外部高速晶體啟動狀態枚舉變量
- 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_GPIOB | RCC_APB2Periph_GPIOF | RCC_APB2Periph_AFIO, ENABLE); //允許GPIOB、GPIOF、AFIO時鐘
- }
- /*******************************************************************************
- 函數名:ADC_Configuration
- 輸 入:
- 輸 出:
- 功能說明:配置ADC
- */
- static void ADC_Configuration(void)
- {
- ADC_InitTypeDef ADC_InitStructure;
- /* 使能 ADC1 and GPIOC clock */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
- RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大時間不能超過14M
- /* 配置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 channel16 configuration */
- ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_55Cycles5); //ADC1,ADC通道16,規則采樣順序值為1,采樣時間為55.5周期
- ADC_TempSensorVrefintCmd(ENABLE); //ADC內置溫度傳感器使能(要使用片內溫度傳感器,切記要開啟它)
- /* 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的軟件轉換啟動功能
- }
- /*******************************************************************************
- * 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);
-
- /* Enable the USART1 Interrupt */
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- //配置TIM2中斷
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- /*******************************************************************************
- 函數名:USART3_Configuration
- 輸 入:
- 輸 出:
- 功能說明:
- 初始化串口硬件設備,啟用中斷
- 配置步驟:
- (1)打開GPIO和USART的時鐘
- (2)設置USART3兩個管腳GPIO模式
- (3)配置USART3數據格式、波特率等參數
- (4)使能USART3接收中斷功能
- (5)最后使能USART3功能
- */
- void USART3_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- /* 第1步:打開GPIO和USART3部件的時鐘 */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
- /* 第2步:將USART3 Tx的GPIO配置為推挽復用模式 */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- /* 第3步:將USART3 Rx的GPIO配置為浮空輸入模式
- 由于CPU復位后,GPIO缺省都是浮空輸入模式,因此下面這個步驟不是必須的
- 但是,我還是建議加上便于閱讀,并且防止其它地方修改了這個口線的設置參數
- */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- /* 第4步:配置USART3參數
- - BaudRate = 115200 baud
- - Word Length = 8 Bits
- - One Stop Bit
- - No parity
- - Hardware flow control disabled (RTS and CTS signals)
- - Receive and transmit enabled
- */
- USART_InitStructure.USART_BaudRate = 115200;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
- USART_Init(USART3, &USART_InitStructure);
- /* 若接收數據寄存器滿,則產生中斷 */
- USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
- /* 第5步:使能 USART3, 配置完畢 */
- USART_Cmd(USART3, ENABLE);
- /* 如下語句解決第1個字節無法正確發送出去的問題 */
- USART_ClearFlag(USART3, USART_FLAG_TC); // 清標志
- }
- /*************************************************
- 函數: void GPIO_Configuration(void)
- 功能: GPIO配置
- 參數: 無
- 返回: 無
- **************************************************/
- void GPIO_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO初始化結構體
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /* 輸出 */
- GPIO_Init(GPIOF, &GPIO_InitStructure);
- }
- /*************************************************
- 函數: 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); //開啟時鐘
- }
- /*******************************************************************/
- /* */
- /* STM32向串口3發送1字節 */
- /* */
- /* */
- /*******************************************************************/
- void Uart3_PutChar(u8 ch)
- {
- /* 發送使能 */
- GPIO_SetBits(GPIOF, GPIO_Pin_10); /* DE = 1 */
- /* 接收禁止 */
- GPIO_SetBits(GPIOF, GPIO_Pin_11); /* nRE = 1 */
- USART_SendData(USART3, (u8) ch);
- while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); //注意此句與RS232不同
- //注意:因為RS485的半雙工方式,在RS485發送數據完畢后,需要把RS485設置在接收狀態,否則收不到主機的數據
- /* 接收使能 */
- GPIO_ResetBits(GPIOF, GPIO_Pin_11); /* nRE = 0 */
- /* 發送禁止 */
- GPIO_ResetBits(GPIOF, GPIO_Pin_10); /* DE = 0 */
- }
- /*******************************************************************/
- /* */
- /* STM32在串口3接收1字節 */
- /* 說明:串口接收中斷 */
- /* */
- /*******************************************************************/
- void USART3_IRQHandler(void) //在中斷服務程序中,由于主機響應中斷時并不知道是哪個中斷源發出中斷請求,因此必須在中斷服務程序中對中斷源進行判別,然后分別進行處理。當然,如果只涉及到一個中斷請求,是不用做上述判別的。但是無論什么情況,做上述判別是個好習慣
- {
- /* 接收使能 */
- GPIO_ResetBits(GPIOF, GPIO_Pin_11); /* nRE = 0 */
- /* 發送禁止 */
- GPIO_ResetBits(GPIOF, GPIO_Pin_10); /* DE = 0 */
- if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //若接收數據寄存器滿
- {
- comm = USART_ReceiveData(USART3); //此語句作用:將USART_DR寄存器的內容傳到comm里。另外,在單緩沖器模式下,軟件讀USART_DR寄存器則完成對RXNE位清除。[注意]在多緩沖器模式下,必須通過軟件清零"傳輸完成標志"DMA1_FLAG_TCx(即:令DMA_IFCR的位CTCIFx=1),否則將會無法跳出中斷服務程序,出現一次中斷請求無數次響應的后果
-
- if(comm == 0x63) //上位機自動查找采集器是否在線
- {
- comm = 0;
- Uart3_PutChar(0x63); //發送CP的ASCII碼
- Uart3_PutChar(0x70);
- }
- }
- }
- /*************************************************
- 函數: 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;
- }
- }
- /*************************************************
- 函數: int main(void)
- 功能: main主函數
- 參數: 無
- 返回: 無
- **************************************************/
- int main(void)
- {
- u16 i;
- RCC_Configuration();
- ADC_Configuration(); //配置PC0 為ADC1_IN10
- GPIO_Configuration();
- NVIC_Configuration();
- USART3_Configuration();
- Timer2_Configuration();
- /* 接收使能 */
- GPIO_ResetBits(GPIOF, GPIO_Pin_11); /* nRE = 0 */
- /* 發送禁止 */
- GPIO_ResetBits(GPIOF, GPIO_Pin_10); /* DE = 0 */
- while(1)
- {
- 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位
- Uart3_PutChar(ah);
- Uart3_PutChar(al);
-
- tempu32 = 0;
- }
- }
- }
復制代碼
0.png (4.05 KB, 下載次數: 92)
下載附件
2019-7-18 02:41 上傳
所有資料51hei提供下載:
55593383LabVIEW-NTCthermistor-temperature (1).rar
(490.51 KB, 下載次數: 153)
2019-7-17 19:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|