1、打开电脑的“控制面板” -->“字体”,把“数码管字体”文件夹中的两个文件,复制到“字体”中
2、重新打开labview,就可以在您的字体设置栏找到NI7SEG字体了
3、本labview采集程序采用了自动识别单片机串口技术,用户不必手动选择串口
4、旋动开发板上的可调电阻,可以看到ADC值在变化
5、本实验的采样率是:10/秒,即labview可以在100ms之内处理完一个数据。如果用户的采样率加大,请采用labview生产者/消费者结构
stm32和labview程序:
LabVIEW波形显示--数字电压表.rar
(1.7 MB, 售价: 3 E币)
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;
- }
- }
- }
- }
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|