版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
某光敏电阻特性测量系统的程序设计案例分析目录TOC\o"1-3"\h\u6226某光敏电阻特性测量系统的程序设计案例分析 1276641.1系统程序设计总体方案 1120151.1.1STM32开发环境介绍 124261.1.2总体方案 2143581.2各个功能模块的程序设计 3149691.2.1IO端口配置 3281221.2.2DAC模块配置 6134521.2.3ADC模块配置 7196241.2.4定时器模块配置 8214151.2.5USART模块配置 9217301.2.6SPI模块配置 11168951.2.7IIC模块配置 13199491.2.8光照度传感器芯片BH1750的配置 14325751.3通讯协议设计 15161671.4命令校验程序设计 18190111.5主程序设计 191.1系统程序设计总体方案1.1.1STM32开发环境介绍本课题使用来自德国Keil公司开发的微控制器软件开发平台KeilMDK5实现光敏电阻特性测量电路的程序设计。MDK5分为MDKCore和SoftwarePacks两个部分。其中,SoftwarePacks的作用是独立于工具链进行新芯片的支持和中间库的升级。MDKCore又分为:编辑器:uVision5IDEwithEditor,编译器:ARMC/C++Compiler,包安装器:PackInstaller,调试跟踪器uVision5DebuggerwithTrace四个部分,其中包安装器又分为芯片支持:Device、ARMCortex微控制器软件接口标准:CMSIS和中间库:Middleware三部分,包安装器使我们可以进行组件的更新,从而支持新的器件、提供新的设备驱动库以及最新例程等,加速产品开发进度。课题中使用到的版本是MDK5.14,该版本使用uVision5IDE集成开发环境,是目前针对ARMCortexM内核处理器的最佳开发工具,它集成了C编译器、宏汇编、连接器、库管理和仿真调试器的功能能够构成完整的开发方案,还具有代码提示和语法动态检测等功能。从软件界面方面来看,它具有与常用的微软VC++相似的界面,易于学习和使用。由于其优秀的性能和低廉的价格在国内ARM开发工具市场达到90%的占有率。1.1.2总体方案本课题中对光敏电阻特性测量电路的程序设计方案如下:首先要对电路核心控制模块中STM32单片机的IO口和外设通过合适的初始化配置和使能,然后对单片机USART模块进行合理的配置使其能够配合485通讯模块实现电路板与上位机之间的通讯,接下来要配置单片机中SPI模块使单片机SPI能够正确发送和接收数据从而顺利获取组织测量模块中高精度AD转换芯片ADS1271的测量结果,然后根据IIC总线通讯协议进行单片机IIC通讯模块的配置,使IIC模块能够正确发送和接收数据来支持单片机与光照度测量模块之间操作指令和测量数据结果的传输。完成STM32单片机中各模块的配置后就要对阻值测量模块的ADS1271和光照度测量模块的BH1750芯片进行配置,通过编写各模块的初始化函数后我们只需要在主函数中将其调用即可完成相应模块的配置。在实现对各个模块的配置后,就要设计一个上位机与电路板之间的通信协议指定发送命令和接收数据的格式,并在此基础上编写程序从帧头、帧尾、命令位数、接收命令是否超时几个方面进行考察来实现对命令接收是否正确的校验。下一步就是进行主程序的编写,使电路板接受到上位机发来符合通信协议的正确命令时根据命令进行相应的操作或测量工作实现对光敏电阻特性进行测量的功能。光敏电阻特性测量电路程序设计总体框图如图1.1所示。图1.1光敏电阻特性测量电路程序设计总体框图1.2各个功能模块的程序设计1.2.1IO端口配置单片机芯片STM32F103RCT6共有51个IO端口,每个IO口由7个寄存器进行控制可以自由编程,如表1.1所示。实际上不仅仅是IO端口,STM32中所有模块的配置归根结底就是通过对相关寄存器进行操作从而实现相应器件模式或参数的配置。但STM32单片机的强大功能建立在其复杂的内部结构基础上,要记住其中数百个寄存器的功能并对其一一进行操作来进行STM32单片机的开发相当困难并且工作量巨大。为了便于开发,意法半导体公司给开发者提供一套固件库函数,其功能就是将寄存器相关的底层操作进行封装,这样当我们需要进行一些配置或操作时就不需要直接对具体的寄存器进行操作,只要调用相应的固件库函数就可以实现。本课题中就使用调用固件库函数的方法进行单片机的配置。表1.1IO口控制寄存器名称位数功能说明GPIOx_IDR32端口输入数据寄存器0~15位对应IO口的状态16~31位保留,始终为0GPIOx_ODR端口输出数据寄存器0~15位对应IO口的输出16~31位保留,始终为0GPIOx_CRH端口配置高寄存器IO口8~15模式配置GPIOx_CRL端口配置低寄存器IO口0~7模式配置GPIOx_BSRR置位/复位寄存器0~15位1:对应的ODR位置10:无影响16~31位1:对应的ODR位清零0:无影响GPIOx_BRR复位寄存器0~15位1:对应的ODR位清零0:无影响16~31位保留GPIOx_LCKR端口配置锁定寄存器0~15位LCKy1:锁定对应IO口的配置0:不锁定对应IO口的配置16位LCKK1:LCKy不可写0:LCKy可写17~31位保留本电路中使用到的IO端口如表1.2所示,STM32单片机的IO口有8种工作模式,分别是:浮空输入、上拉输入、下拉输入、模拟输入、开漏输出、推挽输出、推挽复用、开漏复用。四种输入模式的特点如下:浮空输入模式中,IO端口引脚悬空不连接高电平或低电平,IO口电平状态直接存入输入数据寄存器IDR中我们可以随时从中读出IO口的电平状态,在浮空模式下IO口的电平状态完全取决于来自其连接的器件外部输入,因此常用于数据传输以及按键输入及类似的场合。上拉输入模式中,是将IO端口经内部上拉电阻连接到VDD电源,从而使IO口在没有输入信号和输入信号为高电平时IO口状态为高电平,输入信号为低电平时VDD经上拉电阻与IO引脚处低电平形成回路,使IO口输入状态为低电平,下拉输入模式与上拉输入类似,是将IO端口经内部下拉电阻连接到VSS即GND,从而使IO口在没有输入信号和输入信号为低电平时IO口状态都为低电平,输入信号为高电平时IO口状态为高电平,这样的性质使上拉输入及下拉输入模式很适合用于按键开关的场合,这两种模式也将IO口电平状态直接存入输入数据寄存器IDR,可以通过读IDR寄存器得到IO口电平状态。模拟输入模式中,IO口电平信号直接进入ADC模块而不存入输入数据寄存器IDR中,我们不能从IDR寄存器中读取IO口电平的状态,这种模式下我们得到也的不是逻辑电平“0”或“1”而是IO口所接收电压的模拟值。开漏输出模式的特点是当我们将输出数据寄存器ODR的值设为0时IO口的输出为0V,但当我们将ODR的值设为1时IO口悬空需要外接上拉电阻才能够输出高电平,在开漏输出模式下可以通过改变外接电源的电压和上拉电阻的值改变输出的高电平电压和电流。推挽输出模式的特点则是既可以输出高电平又可以输出低电平并且可以实现高低电平之间的快速切换,适合应用在逻辑电平信号输出和开关控制等场合。我们在进行IO口的配置时需要根据IO端口在电路中的功能并参考与其相连的器件的数据手册等资料选择其工作的模式、响应速度及状态。表1.2IO端口功能及模式引脚功能工作模式说明PC15/OSC32PC15推挽输出控制测试小灯D3亮灭PA8/TIM1_CH1/MCOPA8推挽输出输出模拟开关控制信号SWPA11/CAN_RX/USBDM/TIM1_CH4PA11推挽输出输出485收发模式控制信号RS485REPC8/TIM8_CH3/SDIO_D0PC8推挽输出输出ADS1271模式选择信号MODEPC9/TIM8_CH4/SDIO_D1PC9推挽输出输出ADS1271的SYNC信号PA2/U2_TX/ADC2/TIM2_CH3/TIM5_CH3PA2推挽输出控制LED光源紫灯D1亮灭PA3/U2_RX/ADC3/TIM2_CH4/TIM5_CH4PA3推挽输出控制LED光源蓝灯D2亮灭PA6/SPI1_MISO/ADC6/TIM3_CH1/TIM8_BKINPA6推挽输出控制LED光源绿灯D3亮灭PA7/SPI1_MOSI/ADC7/TIM3_CH2/TIM8_CH1NPA7推挽输出控制LED光源黄绿灯D4亮灭PC4/ADC14PC4推挽输出控制LED光源黄灯D5亮灭PC5/ADC15PC5推挽输出控制LED光源橘灯D6亮灭PB0/ADC8/TIM3_CH3/TIM8_CH2NPB0推挽输出控制LED光源红灯D7亮灭PB1/ADC9/TIM3_CH4/TIM8_CH3NPB1推挽输出控制LED光源白灯D8亮灭PB12/SPI2_NSS/I2S2_WS/I2C2_SMBAI/TIM1_BKINPB12浮空输入接收ADS1271DRDY信号配置IO端口的过程如下:首先在头文件中对配置过程中需要用到的变量及函数进行声明和定义,然后在源文件中调用头文件进行IO端口初始化函数的编写。在初始化IO端口的过程中首先使能IO端口的时钟,然后利用固件库函数中的GPIO_INIT函数确定要配置的端口并进行端口模式和工作速度的配置。在本电路设计中,IO端口PC15、PA8、PA11、PC8、PA2、PA3、PA6、PA7、PC4、PC5、PB0、PB1用于控制灯亮灭以及输出电平信号,将这些端口配置为推挽输出模式。IO端口PB12用于接收电平信号,将其配置为浮空输入模式[28]。1.2.2DAC模块配置STM32F103RCT6单片机芯片中共有两个DAC转换器,二者各对应一个输出通道,DAC模块的结构框图如图1.3所示。DAC模块中共包含五个引脚:有三个引脚分别连接电源、地线以及参考电压、一个引脚为模拟电压输出、还有一个引脚链接外部中断线,通过13个寄存器对两个DAC通道进行控制。其中各引脚及寄存器的功能如表1.3所示。图1.3DAC模块内部结构框图本电路中使用其中的DAC1,其初始化函数配置步骤如下:首先要使能输出引脚GPIOA和定时器通道的时钟,接下来由于DAC通道1的电压输出引脚为PA4,所以要通过固件库函数GPIO_Init将PA4的模式配置为模拟输入模式,下一步要利用固件库函数中的DAC_Init进行DAC通道1的工作模式配置。由于本电路中DAC模块要实现的功能为电压值可控的模拟电压输出而不需要输出某种波形,所以没有使用到触发、波形发生器、输出缓存和DMA功能,因此在DAC通道1的初始化中要将这些功能设置为关闭。完成DAC初始化后,我们将DAC通道1使能并设置DHR中数据格式为12位右对齐,至此就完成了DAC模块的配置工作。表1.3DAC模块内部引脚寄存器功能说明名称功能说明VREF+模拟参考电压输入2.4V≤VREF+≤VDDAVDDA模拟电源输入连接到1.3V电压VSSA模拟电源地输入连接到电路板模拟地线ADC_OUTxDAC通道x模拟电压输出输出范围:0≤VDAC-OUT≤VREF+EXTI_9外部中断线作为触发源之一:外部中断触发,上升沿触发DAC_CR控制寄存器DAC通道工作模式控制0~15位通道1控制16~32位通道2控制DAC_SWTRIGR软件触发寄存器软件触发使能控制0位通道1控制1:使能0:关闭1位通道2控制2~31位保留DAC_DHR数据保持寄存器表示写入DAC通道的数据DAC_DOR数据输出寄存器表示DAC通道的输出数据1.2.3ADC模块配置STM32中的ADC模块中包含了3个12位逐次逼近型的ADC模拟数字转换器,每个ADC有16个通道,各通道可以有四种可以选择的工作模式:单次、连续、扫描或间断模式。ADC的测量结果存储在数据寄存器ADC_DR或ADC_JDRx中,结果数据存储的格式可以选择左对齐或右对齐。ADC的16个通道按进行转换的优先级分为2个通道组:规则通道组和注入通道组,规则通道组最多包含16个通道,注入通道组最多包含4个通道,注入通道的转换可以打断规则通道的转换,规则通道必须等待注入通道的转换完成才能继续进行转换。另外,STM32的ADC模块还具有看门狗功能可以检测输入电压是否超出用户设定的阈值。在配置时需要注意ADC模块的时钟频率应小于或等于14MHz以保证转换结果的准确性。本电路中利用ADC模块中的ADC1通道0实现在上位机控制下进行光敏电阻电压VOUT测量,当STM32接收到来自上位机的查询时间响应数据命令时,ADC模块就要每隔0.1ms进行一次转换读出光敏电阻电压VOUT的值。为了实现如上功能ADC只需进行规则通道中单通道的单次转换,不需要使用注入通道、看门狗等功能。因此我们将ADC模块配置为单次转换模式,规则通道中只有一个通道即通道0。在进行ADC模块配置过程中,首先我们要使能ADC1及其对应输入引脚PA0的时钟,接下来要设置ADC分频因子,单片机APB2总线的时钟频率为72MHz,为了保证ADC模块的时钟频率不大于14MHz必须将ADC分频因子设置为小于7,本课题中将ADC分频因子设为6。下一步我们需要利用固件库函数GPIO_Init将ADC1通道0的输入引脚PA0设置为模拟输入模式,然后再进行ADC1的复位和初始化。我们使用固件库函数ADC_Init设置ADC1工作在独立模式、模数转换工作在单通道单次转换模式、由软件触发AD转换启动、设置规则通道数为1并设置ADC转换结果数据右对齐。完成ADC1的初始化后将其使能,接下来进行复位校准开启校准,等待校准结束,校准结束后就完成了ADC模块的初配置工作。接下来编写读取ADC单次采样值的函数Get_Adc(ch)和读取ADC多次采样平均值的函数Get_Adc_Average(ch,times),参数ch为采样的通道,参数times为多次采样的次数。在主函数中只需对其进行调用即可得到ADC采样结果。读取ADC单次采样值函数和读取ADC多次采样平均值函数的程序流程图如下图1.4所示。(a)读取ADC单次采样值函数流程图(b)读取ADC多次采样平均值函数流程图图1.4读取ADC采样值函数的程序流程图1.2.4定时器模块配置STM32中有八个定时器,其中分为4个通用定时器TIM2~TIM5、两个高级控制计时器TIM1和TIM8以及两个基本定时器TIM6和TIM7。本设计中主要运用的是通用定时器TIM3,它具有三种可选择的计数类型,向上计数向下计数和向上/向下计数。其中向上计数的工作过程是定时器内部16位自动加载递加/递减计数器从零开始向上计数,每过一个计数器时钟周期计数器值加一,当计数器数值达到自动装载值ARR时产生向上溢出事件并重新从零开始计数,向下计数模式和向上计数类似,但是计数器是从自动装载值ARR向下递减到零产生向下溢出中断,而向上/向下计数模式中,计数器是先零开始向上计数到自动装载值ARR产生向上溢出事件,然后再从自动装载值ARR向下计数到零产生向下溢出中断。可以通过配置自动装载值ARR和时钟预分频系数PSC控制溢出时间。溢出时间的计算公式如下:(3-1)本电路中使用STM32定时器模块中的定时器3,设置其为向上计数模式,由于时钟频率为72MHz,所以配置其自动重装值ARR为9、时钟预分频系数PSC为719使定时器每1ms产生一次向上溢出中断,通过定时器向上溢出中断的中断服务函数实现每1ms系统计时sysTick加一。配置定时器模块的步骤如下,首先使能定时器3的时钟然后利用固件库函数中的TIM_TimeBaseInit设置定时器TIM3的计数模式和自动重装值ARR、时钟预分频系数PSC,进行的定时器TIM3初始化。因为我们要利用定时器产生的向上溢出中断,所以下一步我们要进行TIM3中断优先级NVIC设置,配置TIM3中断先占优先级0级、从优先级3级,并使能其IRQ通道。最后就是定时器向上溢出中断的中断服务函数的编写,检测到中断标志位后将系统计时sysTick加一然后清除中断标志位,就实现了每1ms系统计时sysTick加一的功能。1.2.5USART模块配置STM32的USART模块中有三个USART收发器,USART通讯简单硬件要求低,只需发送接收两根线就可以实现双向数据传输,常常搭配串口调试助手应用在设备调试的场合中。通讯中十分重要的两方面分别是通讯速率和传输数据的格式。因为USART使用的TTL电平中0V表示“0”,5V表示“1”,此时波特率的大小与比特率一致所以USART模块通讯速率通过波特率来表示。波特率的设置是通过模块中的波特率发生器完成的,通过写波特率寄存器USART_BRR中的USARTDIV来控制通讯的波特率。USART以帧格式传输数据,将每一帧数据通过自身的TXD接口传输到接收设备的RXD接口,每帧结构为:一位起始位+数据位+停止位,起始位为一位逻辑0,停止位通过USART控制寄存器USART_CR2控制为0.5、1、1.5或2位的逻辑1,一般选用一位停止位。帧结构中起始位后接数据位,数据位由有效数据信息和奇偶校验位组成,数据位字长可选8位或9位,由USART_CR1控制。一般情况下有奇偶校验位时数据位字长配置为9位,无奇偶校验位时配置为8位。在USART配置中我们直接调用固件库函数USART_Init对以上参数进行配置,函数会直接根据我们设定的波特率计算得到USARTDIV来设置USART_BRR寄存器值。USART会产生9种中断如表1.4所示。本设计中只使用接收中断来实现对接收到的命令的帧头的校验。表1.4USART中断请求中断事件事件标志使能标志位发送数据寄存器为空TXETXEIECTS标志CTSCTSIE发送完成TCTCIE准备好读取接收到的数据RXNERXNEIE检测到上溢错误ORE检测到空闲线路IDLEIDLEIE奇偶校验错误PEPEIE断路标志LBDLBDIE噪声标志/上溢错误/帧错误NF/ORE/FEEIE本电路中使用到STM32单片机中的USART1,将其连接到485收发器实现与上位机之间的485总线通讯。在对USART模块的配置过程中,第一步要使能USART1以及其发送端口PA9接收端口PA10的GPIOA时钟,第二步就是要进行发送端口PA9接收端口PA10的初始化,要将发送端口PA9配置为复用推挽输出模式、接收端口PA10配置为浮空输入模式。然后调用固件库函数USART_Init进行USART1串口参数初始化。需要对USART1的波特率、数据帧格式、硬件数据流控制功能以及USART1的工作模式进行配置,本设计中将USART1的波特率设置为115200,数据帧字长设置为8位、停止位设为1位、不设奇偶校验位并将USART1的工作模式设为收发模式。USART1串口参数初始化完成后,由于我们要使用串口接收中断所以要进行其中断优先级NVIC设置,设置其先占优先级为3级、从优先级为3级并使能其IRQ通道。接下来就可以开启串口接受中断并使能串口1。串口接收中断服务函数程序实现帧头判断以及命令位数判断其流程如图1.5所示。图1.5串口接收中断服务函数程序流程图1.2.6SPI模块配置SPI是一种高速全双工同步总线通讯,主设备从设备通过以下4条线实现通信,MOSI:主设备数据输出,从设备数据输入,MISO:主设备数据输入,从设备输出,SCK:时钟信号(由主设备产生),NSS:从设备片选信号(由主设备控制)。通信过程中主设备和从设备中的移位寄存器的数据在SCLK时钟信号控制下通过MOSI线和MISO线进行交换。SPI总线有四种工作方式,由通讯设备的时钟相位CPOL和时钟极性CPHA决定,时钟相位CPOL和时钟极性CPHA的功能如表1.5所示。在配置主设备的SPI模块时需注意SPI通讯中主设备的时钟相位和时钟极性必须与从设备保持一致才能保证数据传输准确无误。本电路中使用STM32单片机中的SPI2实现高精度AD转换芯片的通讯,STM32的SPI模块中,SPI2连接到APB1总线,其总线频率为72MHz。SCK线的时钟信号,由波特率发生器控制,控制寄存器CR1中的BR[0:2]位决定生成SCK时钟的预分频系数。SPI的MOSI及MISO线都连接到数据移位寄存器,对数据寄存器DR进行读写来获取接收数据和设置要发送的数据,通过配置控制寄存器CR1的DFF位可将数据帧长度配置成8位或16位模式;配置LSBFIRST位可选择MSB高位在前还是LSB低位在前。表1.5时钟相位CPOL和时钟极性CPHA参数名称功能说明时钟极性CPOL控制SCK时钟空闲电平状态0:SCK时钟空闲状态为低电平1:SCK时钟的空闲状态为高电平时钟相位CPHA选择SPI通讯的传输协议0:在SCK的第一个跳变沿数据被采样1:在SCK的第二个跳变沿数据被采样在对STM32单片机的SPI模块配置过程中,首先我们要使能SPI2外设时钟及其对应引脚GPIOB的时钟。下一步则是配置SPI引脚的工作模式,SPI通讯中MOSI引脚和SCK引脚都为输出引脚,因此我们需要将其对应的IO口PB13和PB15配置为复用推挽输出模式,MISO引脚为输入引脚,因此我们需要将其对应的IO口PB14配置为上拉输入模式。接下来要进行的就是通过调用固件库函数SPI_Init对SPI2进行配置,在这一步我们必须结合从设备的SPI模式进行配置。将STM32的SPI设置为主设备SPI,工作模式配置为双线双向全双工。通过阅读ADS1271芯片的数据手册可以得知SPI应工作在SCK时钟空闲状态为低电平并且在第一个SCK时钟跳变沿进行数据采样的工作模式,所以我们应将时钟相位CPOL设为0时钟极性CPHA设为0。另外,我们还需要通过配置合理的预分频系数来控制SCK时钟周期从而控制数据传输的时间。在主程序中我们通过ADS1271采样结束后引脚DRDY产生的低电平信号来判断何时开始使用SPI进行AD转换结果数据传输,所以必须保证在ADS1271下一次采样结束DRDY低电平信号到来之前就将24位采样结果数据传输完毕,避免本次采样结果数据传输被下一次采样结果数据传输打断。通过查阅ADS1271芯片的数据手册我们可以得知芯片的采样周期,在我们需要的高分辨率模式下采样周期为512个芯片时钟周期,而完成24位采样结果数据传输需要经过24个SCK时钟周期。ADS1271芯片时钟频率为27MHz,SCK时钟频率为APB1总线时钟频率除以预分频系数,APB1总线时钟频率为72MHz,因此我们需要控制预分频系数小于56,所以这里我们设置SPI模块的预分频系数为8。ADS1271的转换结果为24位,所以我们将SPI数据帧长度大小设为8位,经过三次传输来完成采样结果数据的获取。另外还要设置数据传输格式为MSB在先即从数据的最高位开始传输。最后还要设置NSS片选信号,本电路中与STM32单片机进行SPI通讯的从机只有ADS1271芯片,所以设置NSS片选信号由软件控制。进行以上的参数和模式的选择和配置后就完成了SPI2的初始化,接下来将SPI2使能就完成了STM32单片机SPI模块的配置工作。1.2.7IIC模块配置IIC总线通讯只通过两根线就可以实现主机与从机的通讯,一条是SDA双向串行数据线用于进行数据传输,一条是SCL串行时钟线用于主从机之间数据收发同步。在IIC通讯中,有三种信号类型:开始信号、停止信号、应答信号/非应答信号。其中开始信号由主设备产生,开始信号ST的形式是SCL时钟线状态为高电平时,SDA数据上的电平由高向低跳变。应答信号ACK和非应答信号NACK由接收数据的器件产生,ACK的形式是SCL时钟线状态为高电平时,SDA数据上的电平保持低电平,NACK的形式是SCL时钟线和SDA数据线上的电平状态都为高电平。停止信号SP由主设备产生,形式为SCL时钟线状态为高电平时,SDA数据上的电平由低向高跳变。IIC通讯过程中,主机发出开始信号ST后,继续发送从机的7位或10位地址码和1位传输方向选择位,地址码的作用是当IIC总线上连接多个从机时实现主设备与多个从设备之间准确的通讯,只有地址与主机发送的地址码相同的从机会响应接下来的数据。传输方向选择位的作用是确定接下来数据的传输方向,该位为0时,表示后面的数据传输方向是由主机传输至从机,即写操作。该位为1时,数据传输方向是由从机传输至主机,即读操作。从机接受到主机发送的与其相符的地址码后要发送一个应答信号ACK,主机接收到应答信号后开始主机与从机间的数据传输。在传输数据过程中。每传输八位数据,接收数据的设备都要返回一次ACK应答信号,发送数据的设备接收到应答信号后再继续传输下一个字节的数据。读操作和写操作的不同之处在于停止数据传输的方式,在写操作中,当主机完成数据的发送后,主机向从机发送停止信号SP表示通讯停止,在读操作时,主机要先返回非应答信号NACK,从机收到非应答信号后就不再发送数据,然后主机发送停止信号SP表示通讯停止[29-31]。本电路中使用STM32单片机IIC模块中的IIC2与光照度传感器芯片BH1750进行通讯完成操作指令和测量结果数据的传输。先介绍STM32中IIC模块的配置,主要工作是IIC2使用到的端口配置和按照IIC通讯协议编写IIC的操作函数来实现开始信号、停止信号、应答信号和非应答信号的发送以及发送字节、接收字节、等待应答信号的功能。首先是对IIC2使用到的端口进行配置,;STM32的IIC2使用PB10作为SCL引脚PB11作为SDA引脚。由于IIC通讯中SDA线用于双向数据传输,所以我们需要在头文件中定义IO方向设置的操作SDA_IN()和SDA_OUT(),这两个操作是通过操作GPIOB_CRH端口配置高寄存器中的[12:15]位来配置PB11的模式。SDA_IN()将PB11的模式配置为浮空输入,SDA_OUT()将PB11的模式配置为推挽输出。接下来还要进行端口定义,定义PB10输出为IIC_SCL、PB11输出为IIC_SDA、PB11输入为READ_SDA。然后声明要编写和使用的IIC操作函数。接下来就是在源文件中进行IIC操作函数的编写。首先是初始化函数,它的作用是先将IIC2使用到的端口PB10、PB11初始化配置为推挽输出并使其输出高电平。然后就是编写IIC的操作函数来实现开始信号、停止信号、应答信号和非应答信号的发送以及发送字节、接收字节、等待应答信号的功能。发送信号或数据的函数依据IIC发送数据的协议以及信号的形式进行编写,IIC发送数据时,SDA数据线在SCL的每个时钟周期传输一位数据,SDA数据线上的电平要在SCL状态为高电平时保持稳定不可以发生跳变,在SCL状态为低电平时,SDA数据线的电平状态改变准备进行为下一位数据的传输。IIC操作函数编写完成后就可以在主函数中直接调用实现相应的功能,至此就完成了IIC模块的配置工作。1.2.8光照度传感器芯片BH1750的配置在本电路的光照度测量模块中,通过照度传感器BH1750测量光敏电阻所受光照度值,将其SCL和SDA引脚分别连接至STM32单片机的SCL2和SDA2脚,通过IIC通信协议与STM32单片机进行通信。其中STM32在IIC通讯中作为主机,BH1750则作为从机。光照度传感器芯片BH1750是通过STM32单片机发送操作指令来进行控制的,其测量步骤如图1.6所示。在BH1750的配置中我们需要进行给芯片通电、重置、并进行透光率和模式设置的工作。这些操作都是通过STM32单片机发送操作指令来实现。本电路中BH1750芯片入射窗上没有覆盖其他材料,所以将透光率设置为100%。芯片有三种供选择的测量模式分别是:高分辨率模式、高分辨率模式2和低分辨率模式。为了在各种光照条件下达到更为准确的测量选择高分辨率模式,此模式具有较高的1lx分辨率能够在暗环境下进行测量并且能抑制噪声干扰更加准确稳定的测量。另外,本电路中不需要对光照度进行连续测量所以选择单次测量模式,在测量结束后传感器将自动设置为断电模式[32-35]。查阅BH1750数据手册得到操作指令如表1.6所示。表1.6BH1750操作指令结构指令功能代码注释通电0000_0001等待测量指令重置0000_0111重置数字寄存器值,断电模式下不起作用单次高分辨率模式0010_0000分辨率:1lx测量时间:120ms测量后自动设置为断电模式透光率设置第一字节:0x42透光率设置为100%第二字节:0x65STM32单片机控制BH1750测量光敏电阻所受光照度的过程如下:首先,要启动BH1750芯片,通过查阅BH1750应用手册我们可以得知,本电路中BH1750芯片ADDR引脚接高电平的情况下其地址码为7位“1011100”。所以在使用IIC通讯发送控制指令过程中,主机STM32单片机首先发送BH1750地址码加写操作位“1011_1000”,接收到BH1750的应答信号ACK后,再由主机发送通电指令“0000_0001”给BH1750芯片通电;启动成功后要控制BH1750在单次高分辨率模式下开始测量。主机STM32发送地址码和写操作位,收到来自BH1750应答信号ACK后STM32再向BH1750发送测量模式选择指令“0010_0000”,设置流程如图1.7所示;收到ACK应答信号后,根据应用手册,需要经过200ms以上时间来等待第一次测量完成再读取光照度测量数据,读取数据时主机应先发送地址码加读操作位“1011_1001”,接下来BH1750产生应答信号后先发送数据高八位;然后等待主机应答信号再发送数据低八位,此时已经完成16位测量结果数据的传输,主机STM32发送非应答信号从机BH1750停止发送数据然后由主机发送停止信号结束通讯[36-37]。读取照度测量结果的具体过程如图1.8所示。图1.7设定单次高分辨率模式图1.8读取照度测量结果1.3通讯协议设计本电路要在上位机发送命令的控制下工作,所以我们要对上位机向电路板发送命令以及电路板返回给上位机的应答信号及测量数据的格式进行规定作为上位机于电路板之间的通讯协议。本设计中上位机发送给电路板的命令格式如表1.7所示。命令的长度规定为6个字节,其中第一字节和最后一字节是固定的帧头0xAA和帧尾0x0D,命令的第二字节是电路板作为从机的地址,设置地址是为了便于以后将此光敏电阻测量电路板与其他光电探测器件的测量电路组合在一起作为光电综合实验平台使用,第三字节是命令码,我们通过在程序中用处理多分支选择问题的switch语句读取命令第三字节的命令码实现电路板根据命令码执行不同的操作的功能[38]。第四字节和第五字节是命令中的参数。表1.7上位机发给电路板的命令和参数序号功能帧头地址码命令码参数1参数2帧尾1选灯0xAA0x010x01选灯字节0x000x0D2设置LED工作电流0xAA0x010x02DAC高字节DAC低字节0x0D3设置恒流源电流0xAA0x010x030x00:低电流0xFF:高电流0x000x0D4查询暗电阻阻值0xAA0x010x040x000x000x0D5查询亮电阻阻值0xAA0x010x050x000x000x0D6查询时间响应数据0xAA0x010x060x000x000x0D7查询光照度0xAA0x010x070x000x000x0D命令1是控制光源板进行选灯的命令,读取到命令的命令码为0x01时,接下来程序要再用switch语句读取第四字节选灯字节中的参数来确定要开启哪一盏LED灯,选灯字节中参数的含义和电路板执行的操作如表1.8所示。表1.8选灯命令中的参数参数1功能操作0x00灭灯所有控制LED灯的IO端口输出设为低电平0x01点亮D1紫灯PA2输出设为高电平,其余设为低电平0x02点亮D2蓝灯PA3输出设为高电平,其余设为低电平0x03点亮D3绿灯PA6输出设为高电平,其余设为低电平0x04点亮D4黄绿灯PA7输出设为高电平,其余设为低电平0x05点亮D5黄灯PC4输出设为高电平,其余设为低电平0x06点亮D6橘灯PC5输出设为高电平,其余设为低电平0x07点亮D7红灯PB0输出设为高电平,其余设为低电平0x08点亮D8白灯PB1输出设为高电平,其余设为低电平命令2是设置光源板上LED光源的工作电流的命令,其中第四字节第五字节的参数为写入DAC的DHR寄存器中的数值,我们通过改变第四字节第五字节的参数来控制STM32单片机DAC模块输出电压的值,从而实现了LED工作电流的控制。命令3是设置恒流源电流档位的命令,通过switch语句读取第四字节,参数为0x00则通过将IO端口PA8输出设为低电平使模拟开关SW信号为低电平5脚COM脚与7脚NC脚接通将阻值为1MΩ的较大基准电阻连接到运放的反相输入端,输出低电流;参数为0xFF则将PA8输出设为高电平,模拟开关SW信号为高电平将阻值为10kΩ的较小基准电阻连接到运放的反相输入端,输出高电流。命令4是查询暗电阻阻值的命令,电路板接收到命令4后先将PA8输出设为低电平使恒流源输出低电流然后等待DRDY低电平信号到来,接收到DRDY低电平信号后就开始传输24位结果数据,SPI从高位开始传输每次传输8位,经过三次传输后,通过移位操作将三次传输得到的数据合成为24位的大数得到ADS1271的测量结果,下一步就是数据处理,计算出光敏电阻的阻值,将组织数据分为高八位和第八位按照表1.9中的格式把数据返回给上位机。命令5是查询亮电阻阻值的命令,查询暗电阻阻值的过程和查询暗电阻阻值类似,只是在第一步中需要将PA8输出设为高电平使恒流源输出高电流,另外在数据处理过程中也是用光敏电阻电压除以恒流源输出的高电流值来进行光敏电阻的亮电阻阻值的计算。表1.9电路板给上位机发送数据的格式序号功能帧头地址码命令码参数1参数2帧尾1选灯设置完毕0xAA0x010x010x000x000x0D2LED工作电流设置完毕0xAA0x010x020x000x000x0D3恒流源电流设置完毕0xAA0x010x030x000x000x0D4上传暗电阻阻值0xAA0x010x04暗电阻高字节暗电阻低字节0x0D5上传亮电阻阻值0xAA0x010x05亮电阻高字节亮电阻低字节0x0D6查
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 八年级道德与法治粤教版阶段提升第三单元同步测试卷基础版A卷
- 第7课 排序“员工考评表”
- 儿童健康手册-1
- 钢结构消防安全考评标准
- 血液透析健康控水指导
- 卧龙安全生产月活动讲解
- 2026年下教资笔试学科知识与能力高频考点精练卷(含解析)
- 会议室资源时段分配调整通知(6篇范文)
- 诚信在日常工作中的作用:小学主题班会课件
- 关于产品交付逾期事宜的确认函7篇
- GB/T 45128-2025塑料含水量的测定
- GB/T 21270-2025食品馅料质量通则
- 预应力混凝土枕产品检验项目及依据标准
- 10S505 柔性接口给水管道支墩
- 奥的斯电梯OH7000调试资料故障代码OH-CONFB03
- 2024年山西省吕梁市方山文旅集团招聘笔试冲刺题(带答案解析)
- 必修第一册第一章集合与常用逻辑用语单元测试试卷
- 2024-2025北京中考英语真题阅读CD篇
- 企业安全风险分级管控21类表格、标牌
- 视觉传达设计考研名词解释和填空
- GB/T 4798.3-2023环境条件分类环境参数组分类及其严酷程度分级第3部分:有气候防护场所固定使用
评论
0/150
提交评论