嵌入式系统原理及应用项目化教程 课件 项目七 模数转换设计与实现_第1页
嵌入式系统原理及应用项目化教程 课件 项目七 模数转换设计与实现_第2页
嵌入式系统原理及应用项目化教程 课件 项目七 模数转换设计与实现_第3页
嵌入式系统原理及应用项目化教程 课件 项目七 模数转换设计与实现_第4页
嵌入式系统原理及应用项目化教程 课件 项目七 模数转换设计与实现_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统原理及应用

项目化教程项目7模数转换设计与实现学习目标1.了解STM32的ADC主要特点和结构;2.了解STM32与ADC编程相关的寄存器和库函数;3.会使用STM32的ADC寄存器和库函数,完成A/D转换程序设计;4.会利用STM32的ADC,实现模拟电压的采集并在串口上打印出来。目录7.1ADC介绍7.2任务12基于库函数的STM32F1ADC控制设计7.3任务13DS18B20温度传感器控制ADCADCAnalog-to-DigitalConverter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。7.1ADC介绍ADCSTM32F10xADC特点12位逐次逼近型的模拟数字转换器。最多带3个ADC控制器最多支持18个通道,可最多测量16个外部和2个内部信号源。支持单次和连续转换模式

转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。

通道0到通道n的自动扫描模式

自动校准

采样间隔可以按通道编程

规则通道和注入通道均有外部触发选项

转换结果支持左对齐或右对齐方式存储在16位数据寄存器ADC转换时间:最大转换速率1us。(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到。)ADC供电要求:2.4V-3.6VADC输入范围:VREF-≤VIN≤VREF+7.1ADC介绍ADCSTM32F10x大容量芯片带3个ADC控制器其中144脚芯片因为带PF脚,所以多5个通道,为21个外部通道。小于144脚芯片只有16个外部通道。7.1ADC介绍ADCSTM32F10x系列芯片ADC通道和引脚对应关系7.1ADC介绍ADCADC引脚7.1ADC介绍ADCADC框图7.1ADC介绍ADC7.1ADC介绍ADCSTM32通道组规则通道组:相当正常运行的程序。最多16个通道。

规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则

组转换的总数应写入ADC_SQR1寄存器的L[3:0]中②注入通道组:相当于中断。最多4个通道。

注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组

里转化的总数应写入ADC_JSQR寄存器的L[1:0]中7.1ADC介绍ADC规则通道1规则通道2规则通道N注入通道1注入通道1规则通道1规则通道2规则通道N注入通道N7.1ADC介绍ADCSTM32F1的ADC的各通道可以单次,连续,扫描或者间断模式执行。7.1ADC介绍ADC单次转化VS连续转换7.1ADC介绍ADC单次转化VS连续转换7.1ADC介绍ADC扫描模式7.1ADC介绍ADCADC中断7.1ADC介绍ADCADC时钟配置不要让ADC时钟超过14MHz,否则可能不准。RCC_ADCCLKConfig(RCC_PCLK2_Div6);7.1ADC介绍ADCADC_CR1寄存器在扫描模式下,由ADC_SQRx或者ADC_JSQRx寄存器选中的通道被转换。如果设置了EOCIE或者JEOCIE,在最后一个通道转换完毕后才会产生EOC或者JEOC中断。7.1ADC介绍ADCADC_CR1寄存器7.1ADC介绍ADCADC_CR2寄存器7.1ADC介绍ADC数据对齐方式7.1ADC介绍ADCADC_CR2寄存器7.1ADC介绍ADCADC_SMPR1寄存器7.1ADC介绍ADCADC_SMPR2寄存器7.1ADC介绍ADCADC的采样时间最小采样时间1us(ADC时钟=14MHz,采样周期为1.5周期下得到)7.1ADC介绍ADCADC_SQR1/SQR2/SQR3规则序列寄存器7.1ADC介绍ADCADC_JSQR注入系列寄存器7.1ADC介绍ADCADC_DR规则通道数据寄存器7.1ADC介绍ADCADC_JDR注入通道数据寄存器7.1ADC介绍ADCADC_SR状态寄存器7.1ADC介绍ADC常用库函数voidADC_Init(ADC_TypeDef*ADCx,ADC_InitTypeDef*ADC_InitStruct);voidADC_DeInit(ADC_TypeDef*ADCx)voidADC_Cmd(ADC_TypeDef*ADCx,FunctionalStateNewState);voidADC_ITConfig(ADC_TypeDef*ADCx,uint16_tADC_IT,FunctionalStateNewState);voidADC_SoftwareStartConvCmd(ADC_TypeDef*ADCx,FunctionalStateNewState);voidADC_RegularChannelConfig(ADC_TypeDef*ADCx,uint8_tADC_Channel,uint8_tRank,uint8_tADC_SampleTime);uint16_tADC_GetConversionValue(ADC_TypeDef*ADCx);voidADC_ResetCalibration(ADC_TypeDef*ADCx);FlagStatusADC_GetResetCalibrationStatus(ADC_TypeDef*ADCx);voidADC_StartCalibration(ADC_TypeDef*ADCx);FlagStatusADC_GetCalibrationStatus(ADC_TypeDef*ADCx);7.1ADC介绍ADCADC初始化函数ADC_Init

voidADC_Init(ADC_TypeDef*ADCx,ADC_InitTypeDef*ADC_InitStruct);typedefstruct{uint32_tADC_Mode;//ADC模式:配置ADC_CR1寄存器的位[19:16]:DUALMODE[3:0]位FunctionalStateADC_ScanConvMode;//是否使用扫描模式。ADC_CR1位8:SCAN位

FunctionalStateADC_ContinuousConvMode;//单次转换OR连续转换:ADC_CR2的位1:CONTuint32_tADC_ExternalTrigConv;//触发方式:ADC_CR2的位[19:17]:EXTSEL[2:0]uint32_tADC_DataAlign;//对齐方式:左对齐还是右对齐:ADC_CR2的位11:ALIGNuint8_tADC_NbrOfChannel;//规则通道序列长度:ADC_SQR1的位[23:20]:L[3:0]}ADC_InitTypeDef;7.1ADC介绍ADC

voidADC_Init(ADC_TypeDef*ADCx,ADC_InitTypeDef*ADC_InitStruct);ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立模式ADC_InitStructure.ADC_ScanConvMode=DISABLE; //不开启扫描ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//单次转换模式ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//触发软件ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对齐ADC_InitStructure.ADC_NbrOfChannel=1;//顺序进行规则转换的ADC通道的数目ADC_Init(ADC1,&ADC_InitStructure); 7.1ADC介绍ADCADC使能函数

ADC_Cmd();

voidADC_Cmd(ADC_TypeDef*ADCx,FunctionalState

NewState);ADC_Cmd(ADC1,ENABLE); //使能指定的ADC1ADC使能软件转换函数ADC_SoftwareStartConvCmdvoidADC_SoftwareStartConvCmd(ADC_TypeDef*ADCx,FunctionalStateNewState)ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能ADC1的软件转换启动7.1ADC介绍ADCADC规则通道配置函数ADC_RegularChannelConfigADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);ADC获取转换结果函数ADC_GetConversionValueuint16_tADC_GetConversionValue(ADC_TypeDef*ADCx);ADC_GetConversionValue(ADC1);//获取ADC1转换结果

voidADC_RegularChannelConfig(ADC_TypeDef*ADCx,uint8_tADC_Channel,uint8_tRank,uint8_tADC_SampleTime);7.1ADC介绍7.2任务12基于库函数的STM32F1ADC控制设计ADC1对应芯片的PA1引脚,将该引脚直接外部连接到电位器上,调节电位器即可改变电压,通过ADC转换即可检测此电压值。

7.2任务12基于库函数的STM32F1ADC控制设计DS18B20介绍DS18B20技术性能特征①、独特的单总线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实

现微处理器与DS18B20的双向通讯。大大提高了系统的抗干扰性。②、测温范围-55℃~+125℃,精度为±0.5℃。③、支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,

实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的

不稳定。④、工作电源:3.0~5.5V/DC(可以数据线寄生电源)。⑤、在使用中不需要任何外围元件。⑥、测量结果以9~12位数字量方式串行传送。7.3任务13DS18B20温度传感器控制DS18B20封装7.3DS18B20介绍连接方式7.3DS18B20介绍单总线是一种半双工通信方式DS18B20共有6种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1。所有这些信号,除了应答脉冲以外,都由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前。7.3DS18B20介绍复位脉冲单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平时间至少480us,,以产生复位脉冲。接着主机释放总线,4.7K的上拉电阻将单总线拉高,延时15~60us,并进入接收模式(Rx)。接着DS18B20拉低总线60~240us,以产生低电平应答脉冲。

//复位DS18B20voidDS18B20_Rst(void) {DS18B20_IO_OUT();//设置为输出模式DS18B20_DQ_OUT=0;//拉低DQ

delay_us(750);//拉低750us(至少480us)DS18B20_DQ_OUT=1;//DQ=1拉高释放总线

delay_us(15);//15US//进入接受模式,等待应答信号。}7.3DS18B20介绍②应答信号//等待DS18B20的回应//返回1:未检测到DS18B20的存在返回0:存在u8DS18B20_Check(void) {u8retry=0;DS18B20_IO_IN();//SETPA0INPUT while(DS18B20_DQ_IN&&retry<200){retry++;

delay_us(1);}; if(retry>=200)return1;elseretry=0;while(!DS18B20_DQ_IN&&retry<240){retry++;

delay_us(1);};if(retry>=240)return1; return0;}7.3DS18B20介绍③写时序写时序包括写0时序和写1时序。所有写时序至少需要60us,且在2次独立的写时序之间至少需要1us的恢复时间,两种写时序均起始于主机拉低总线。写1时序:主机输出低电平,延时2us,然后释放总线,延时60us。写0时序:主机输出低电平,延时60us,然后释放总线,延时2us。7.3DS18B20介绍//写一个字节到DS18B20//dat:要写入的字节voidDS18B20_Write_Byte(u8dat){u8j;u8testb;DS18B20_IO_OUT();//设置PA0为输出for(j=1;j<=8;j++){

testb=dat&0x01;

dat=dat>>1;if(testb)//输出高{DS18B20_DQ_OUT=0;//主机输出低电平

delay_us(2);//延时2usDS18B20_DQ_OUT=1;//释放总线

delay_us(60);//延时60us}else//输出低{DS18B20_DQ_OUT=0;//主机输出低电平

delay_us(60);//延时60usDS18B20_DQ_OUT=1;//释放总线

delay_us(2);//延时2us}}}7.3DS18B20介绍④读时序单总线器件仅在主机发出读时序时,才向主机传输数据,所以,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要60us,且在2次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us之内采样总线状态。典型的读时序过程为:主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取单总线当前的电平,然后延时50us。7.3DS18B20介绍//从DS18B20读取一个位//返回值:1/0u8DS18B20_Read_Bit(void) //readonebit{u8data;DS18B20_IO_OUT();//设置为输出DS18B20_DQ_OUT=0;//输出低电平2us

delay_us(2);DS18B20_DQ_OUT=1;//拉高释放总线DS18B20_IO_IN();//设置为输入

delay_us(12);//延时12usif(DS18B20_DQ_IN)data=1;//读取总线数据elsedata=0;

delay_us(50);//延时50usreturndata;}典型的读时序过程为:主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取单总线当前的电平,然后延时50us。7.3DS18B20介绍//从DS18B20读取一个字节//返回值:读到的数据u8DS18B20_Read_Byte(void)//readonebyte{u8i,j,dat;

dat=0;for(i=1;i<=8;i++){j=DS18B20_Read_Bit();

dat=(j<<7)|(dat>>1);} returndat;}读取一个字节数据7.3DS18B20介绍我们来看看DS18B20的典型温度读取过程,DS18B20的典型温度读取过程为:复位

发SKIPROM命令(0XCC)

发开始转换命令(0X44)

延时

复位

发送SKIPROM命令(0XCC)

发读存储器命令(0XBE)

连续读出两个字节数据(即温度)

结束。7.3DS18B20介绍//从ds18b20得到温度值//精度:0.1C//返回值:温度值(-550~1250)shortDS18B20_Get_Temp(void){u8temp;u8TL,TH;shorttem;DS18B20_Start();//ds1820startconvertDS18B20_Rst();复位DS18B20_Check(); DS18B20_Write_Byte(0xcc);//skipromDS18B20_Write_Byte(0xbe);//convert TL=DS18B20_Read_Byte();TH=DS18B20_Read_Byte(); if(T

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论