设为首页
收藏本站
开启辅助访问
登录
注册
只需一步,快速开始
首页
BBS
在线充值
搜索
工控币获得方法
联系方式
搜索
搜索
本版
帖子
用户
工控论坛
»
首页
›
电子技术
›
Labview
›
STM32+LabVIEW的USB数据采集与显示源程序
返回列表
发新帖
STM32+LabVIEW的USB数据采集与显示源程序
[复制链接]
1
|
0
|
2020-12-13 00:06:31
|
显示全部楼层
|
阅读模式
1、打开电脑的“控制面板” -->“字体”,把“数码管字体”文件夹中的两个文件,复制到“字体”中
2、重新打开labview,就可以在您的字体设置栏找到NI7SEG字体了
3、本labview采集程序采用了自动识别单片机串口技术,用户不必手动选择串口
4、旋动开发板上的可调电阻,可以看到ADC值在变化
5、本实验的采样率是:10/秒,即labview可以在100ms之内处理完一个数据。如果用户的采样率加大,请采用labview生产者/消费者结构
stm32和labview程序:
LabVIEW波形显示--数字电压表.rar
(1.7 MB, 售价: 2 工控币)
2020-12-13 00:05 上传
点击文件名下载附件
stm32部分源程序如下:
/*****************************************************************
*
* 文件名: 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;
}
}
}
}
复制代码
usb
,
stm32
,
labview
相关帖子
•
基于labview的电子秤
•
基于LabVIEW的猜数字游戏
•
51单片机采集温度通过串口发送到labview上位机采集曲线显示
•
Labview 汉诺塔程序
•
labview生成二维码的程序
•
分享labview的一些简单的小程序
•
基于LABVIEW的虚拟调制解调器设计
•
labVIEW信号发生器和加单边双边FFT加功率谱测量加滤波器信...
•
Labview电子时钟设计课程设计报告
•
基于LABVIEW温度越限报警程序设计
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
coolfire
110
主题
111
帖子
99
积分
初级会员
初级会员, 积分 99, 距离下一级还需 401 积分
初级会员, 积分 99, 距离下一级还需 401 积分
工控币
99
加好友
发消息
回复楼主
返回列表
电子技术综合讨论
单片机嵌入式
EDA设计仿真
STM32/8
51单片机
上位机开发及系统管理
Labview
Multisim仿真
图文推荐
用Fanuc Karel语言实现三点建坐标系
2021-01-04
用CH341A做的USB转SPI_232_485_TTL转换器 PCB+SCH文件 烧写器源
2020-12-14
51单片机采集温度通过串口发送到labview上位机采集曲线显示
2020-12-13
基于组态王的占空比PID算法温度控制系统设计 含源码和文档
2020-12-13
基于LabVIEW的电动车速度监测和控制系统上位机程序设计
2020-12-08
热门排行
1
谁有Simatic net v16的激活工具 EBK不行啊
2
西门子PLC电气设计与编程自学宝典双色版 [
3
西门子G120变频器精英训练营视频教程
4
博途TIA Portal V16+UPD1
5
西门子S7-200 SMART 精英训练营视频教程(5
6
HMI人机交互设计大师课程(七集)
7
有没有 GE plc PME9.0版本的中文对照表
8
永宏PLC红绿灯控制程序
9
西家V90精英训练营视频教程(54课时)
10
FACTORY IO 2.4.3 虚拟仿真调试软件 支持西