STM32+DMA+UART+ADC+内部温度传感器

合集下载

STM32-内部温度传感器-串口显示-完整程序

STM32-内部温度传感器-串口显示-完整程序

STM32F103 内部温度传感器用串口传递到PC上显示程序如下:#include "stm32f10x.h"#include "stm32_eval.h"#include "stm32f10x_conf.h"#include <stdio.h>#define DR_ADDRESS ((uint32_t)0x4001244C) //ADC1 DR寄存器基地址USART_InitTypeDef USART_InitStructure; //串口初始化结构体声明ADC_InitTypeDef ADC_InitStructure; //ADC初始化结构体声明DMA_InitTypeDef DMA_InitStructure; //DMA初始化结构体声明__IO uint16_t ADCConvertedValue; // 在内存中声明一个可读可写变量用来存放AD的转换结果,低12 位有效void ADC_GPIO_Configuration(void);static void Delay_ARMJISHU(__IO uint32_t nCount){ for (; nCount != 0; nCount--);}int main(void){u16 ADCConvertedValueLocal;USART_ART_BaudRate = 115200;USART_ART_WordLength = USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;STM_EVAL_COMInit(COM1, &USART_InitStructure);/* Enable DMA1 clock */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_DeInit(DMA1_Channel1); //开启DMA1的第一通道DMA_InitStructure.DMA_PeripheralBaseAddr = DR_ADDRESS; DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)&ADCConver tedValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //DMA 的转换模式为SRC模式,由外设搬移到内存DMA_InitStructure.DMA_BufferSize = 1; //DMA缓存大小,1个 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //接收一次数据后,设备地址禁止后移DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//关闭接收一次数据后,目标内存地址后移DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //定义外设数据宽度为16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //DMA搬移数据尺寸,HalfWord就是为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //转换模式,循环缓存模式。

stm32 adc工作原理

stm32 adc工作原理

stm32 adc工作原理
STM32 ADC工作原理
STM32微控制器的ADC(模拟数字转换器)模块可以将模拟
信号转换为数字信号。

ADC是一种重要的外设,用于从外部
传感器或其他模拟源获取数据。

ADC模块的工作包括采样、保持、量化和序列转换等过程。

首先,ADC模块会接收来自外部模拟信号的输入。

这些信号
可以是来自温度传感器、光敏电阻或其他传感器的模拟信号。

接下来,ADC模块会将输入信号通过采样和保持电路进行采样。

采样是指将模拟信号转换为相应的电压值。

保持电路将输入信号的电压保持在一个稳定的水平上,以便进行后续的处理。

然后,ADC模块将采样和保持的电压值进行量化。

量化是指
将连续的模拟信号转换为离散的数字信息。

ADC模块使用一
定的分辨率来表示模拟信号,例如12位或16位。

最后,ADC模块将量化后的数字信息通过序列转换器进行处理。

序列转换器将多个信道的数字信息按照一定的顺序进行转换和存储。

转换的结果可以存储在寄存器中供CPU读取,或
者被DMA直接传输到内存中。

总结来说,STM32 ADC工作原理包括采样、保持、量化和序
列转换等步骤,将外部模拟信号转换为数字信息,以供微控制器进行进一步处理和分析。

Stm32F407IG内部温度传感器测试(CORTEX-M4+ADC+DMA)

Stm32F407IG内部温度传感器测试(CORTEX-M4+ADC+DMA)

Stm32F407IG内部温度传感器测试(CORTEX-M4+ADC+DMA)刚才发了ADC的一般用法,得知stm32内部内置了一个温度传感器,于是趁热调试了一下内部温度传感器。

没有软件滤波,正如手册里所说的,该温度传感器起到一个检测温度变化的作用,如果你想要精确的温度测量,请你外置测温元件...呵呵,测试结果如图:代码如下:/************************************************************Copyright (C), 2012-2022, yin.FileName: main.cAuthor: 小枣年糕Date: 2012\05\01Description: ADC1 DMA tempersensor printfVersion: V3.0IDE: MDK 4.22aHardWare: stm32F407IG HSE = 25M PLL = 168MHistory: V1.0Function: 利用ADC读取芯片内部温度传感器的值***********************************************************/#include<stm32f4xx.h>#include<stdio.h>/*定义ADC1的数据寄存器地址,DMA功能要用到外设的数据地址*ADC1的数据地址为外设基地址+偏移地址,基地址在RM0090 Reference*manual(参考手册)的地址映射表里,为0x40012000,ADC_DR*偏移地址为0x4C,故实际地址为0x40012000+0x4C = 0x4001204C */#define ADC1_DR_Addr ((uint32_t)0x4001204C)__IO uint16_t ADCoverValue;__IO float Temper;void GPIO_Config(void);void ADC_Config(void);void USART_Config(void);void DMA_Config(void);void NVIC_Config(void);void Delay(uint32_t nCount);/* printf函数重定向*/int fputc(int ch, FILE *f);main(){/*在主函数main之前通过调用启动代码运行了SystemInit函数,而这个函数位于system_stm32f4xx.c”。

STM32温度传感器ppt课件

STM32温度传感器ppt课件
读取通道 16 内部温度传感器通道,10 次取平均 temperture=(float)adc_value*(3.3/4096); //电压值 temperture=(1.43-temperture)/0.0043+25; //转换为温度值 temp=temperture*100; //扩大 100 倍. return temp; }
ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_None;//禁止触发检测,使用软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; //1 个转换在规则序列中 也
器的状态 ADC_StartCalibration(ADC1);//开始指定 ADC 的校准状态 while(ADC_GetCalibrationStatus(ADC1));//获取指定 ADC 的校准程序 ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的
(2)STM32F103ZET6 的内部温度传感器固定的连接 在 ADC1_IN16 上,所以,我们在设置好 ADC1 之后 只要读取通道 16 的 AD 值,就知道温度传感器返回来 的电压值了。根据这个值,我们就可以计算出当前温度。 计算公式如下:
T(℃) ={( V25 - Vsense) /Avg_Slope}+25 公式中: V25=Vsense 在 25 度时的数值(典型值为:1.43V)。 Avg_Slope=温度与 Vsense 曲线的平均斜率(单位为

STM内部温度传感器串口显示完整程序

STM内部温度传感器串口显示完整程序

[80乙NN入fP86TLN£W8乙丄dflCTM丄入门]:各霸尅勒昭护轴兀(g) @ @ @•4r耳5F第誓曹a审嚣敢尊®猱姆W WISS T M 3 2 F 1 0 3 内部温度传感器用串口传递到P C ±显示程序如下:#include "”ttinclude#include "”ttinclude <>ttdefine DR_ADDRESS ((uint32_t) 0x4001244C) n\r〃,a, b, c, d);Delay_ARMJISHU(8000000);}}void ADC_GP 10_Conf i gur at ion (vo id) //ADC 配置函数{GPIO_InitTypeDef GPIO_InitStructure;//PCO作为模拟通道10输入引脚=GPI0_Pin_0; 〃管脚 1=GPIO_Mode_AIN;//输入模式GPI0_Init(GPI0C, &GPI0_InitStructure);//GPI0 组当前STM32芯片内部温度为:00&8°C.当M-STM32芯片內部温度为:0047°C .当前STM32芯片内部温度为;00489 .当前STM32芯片內部温度为:0触TC.当前STM32芯片内部温度为;0047^C .当前STM32芯片内部温度为:如匸TC.当前STM32芯片内部温度为:0047ff C .当前STM32芯片内部温度为:0047^C .当M-STM32芯片內部温度为:0047°C .当前STM32芯片内部温度为;8047^ .当前STM32芯片內部温度为:0酣6°C.关于一些数据格式的定义解释:ttifndef _STM32F10x_TYPE_H#define _STM32F10x_TYPE_Htypedef signed long?s32;typedef signed char?s8;typedef signed long?const sc32;typedef signed short const scl6;typedef signed charconst sc8: typedef volatile signed long?vs32;超级终端显示如下: 当前STM32芯片內部温度为:0046°C .typedef signed short sl6;typedef volatile signed short vsl6:volatile unsigned charconst vuc8;typedef enum {FALSE 二 0, TRUE 二!FALSE} bool: typedef enum {RESET = 0, typedef volatile signed char?vs8:typedef volatile signed long?const vsc32;typedef volatile signed short const vscl6:typedef volatile signed charconst vsc8:typedef unsigned long?u32; typedef unsigned short ul6:typedef unsigned char?u8;typedef unsigned long?const uc32;typedef unsigned short constucl6;typedef unsigned charconst uc8; typedef volatile unsigned long?vu32;typedef volatile unsigned short vul6:typedef volatile unsigned char?vu8;typedef volatile unsigned long?const vuc32:typedef volatile unsignedshort const vucl6;typedefSET = !RESET} FlagStatus, ITStatus;typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;ttdefineIS_FUNCTIONAL_STATE(STATE) (((STATE)二二DISABLE) | ((STATE)二二ENABLE)) typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;ttdefine U8JIAX? ((u8) 255)ttdefine S8_MAX?((s8)127)ttdefine S8_MIN?((s8)-128)ttdefine U16J1AX? ((ul6) 65535u)ttdefine S16JIAX?((sl6) 32767)ttdefine S16_MIN?((sl6)-32768)ttdefine U32JIAX?ttdefine S32JIAX?ttdefine S32_MIN?ttendif。

STM32-内部温度传感器-串口显示-完整程序

STM32-内部温度传感器-串口显示-完整程序
STM32F103内部温度传感器用串口传递到PC上显示
程序如下:
#include"stm32f10x.h"
#include"stm32_eval.h"
#include"stm32f10x_conf.h"
#include<stdio.h>
#defineDR_ADDRESS((uint32_t)0x4001244C)//ADC1DR寄存器基地址
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//连续转换开始,ADC通过DMA方式不断的更新RAM区。
while(1)
{
vu16Temperature,a,b,c,d;
ADCConvertedValueLocal=ADCConvertedValue;
Temperature=(1.43-ADCConvertedValueLocal*3.3/4096)*1000/4.35+25;
typedefvolatilesignedlong??vs32;typedefvolatilesignedshortvs16;typedefvolatilesignedchar??vs8;
typedefvolatilesignedlong??constvsc32;?typedefvolatilesignedshortconstvsc16;?typedefvolatilesignedchar??constvsc8;??
typedefvolatileunsignedlong??vu32;typedefvolatileunsignedshortvu16;typedefvolatileunsignedchar??vu8;

stm32 内部温度传感器

stm32 内部温度传感器

/*
DMA1
channel1
configuration
----------------------------------------------*/
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
V25
最小=1.34V 典型=1.43V 最大=1.52V
Avg_Slope 最小=4.0 典型=4.3 最大=4.6 单位是 mV/℃
例如读到 Vsense = 1.30V。分别取 V25和 Avg_Slope 的典型值,计算得到:
(1.43 - 1.30)/0.0043 + 25 = 55.23
* Input
: None
* Output
: None
* Return
: None
************************************************************************
*******/
void ADC_Configuration(void)
{
设想一个 XY 坐标,X 轴为 ADC 的电压读数,Y 轴为温度,两轴之间有一条直线代 表了温度与转换电压的关系;在这条直线上如果 X 轴电压为 V25时,Y 轴即为25 ℃;当读出的电压是其它数值时,即读出的电压是 Vsense 时,使用这个公式就可 以得到温度的数值。
在 STM32F103xx 的数据手册中分别给出了 V25和 Avg_Slope 的值:
/* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */

STM32-ADC结合DMA数据采样与软件滤波处理

STM32-ADC结合DMA数据采样与软件滤波处理

STM32 ADC结合DMA数据采样与软件滤波处理2012-03-17 23:53:05| 分类:STM32 | 标签:adc结合dma |字号大中小订阅本文原创于观海听涛,原作者版权所有,转载请注明出处。

作为一个偏向工控的芯片,ADC采样是一个十分重要的外设。

STM32集成三个12位精度18通道的内部ADC,最高速度1微秒,结合DMA可以解放CPU进行更好的处理。

ADC接口上的其它逻辑功能包括:●同步的采样和保持●交叉的采样和保持●单次采样模拟看门狗功能允许非常精准地监视一路、多路或所有选中的通道,当被监视的信号超出预置的阀值时,将产生中断。

由标准定时器(TIMx)和高级控制定时器(TIM1和TIM8)产生的事件,可以分别内部级联到ADC 的开始触发和注入触发,应用程序能使AD转换与时钟同步。

12位ADC是一种逐次逼近型模拟数字数字转换器。

它有多达18个通道,可测量16个外部和2个内部信号源。

ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生。

如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位被设置。

关于ADC采样与DMA关系,引用网上一段解释:STM32 的优点在哪里?除去宣传环节,细细分析。

STM32 时钟不算快,72MHZ,也不能扩展大容量的RAM FLASH,同样没有 DSP 那样强大的指令集。

它的优势在哪里呢?---就在快速采集数据,快速处理上。

ARM 的特点就是方便。

这个快速采集,高性能的ADC 就是一个很好的体现,12 位精度,最快1uS 的转换速度,通常具备2 个以上独立的ADC 控制器,这意味着,STM32 可以同时对多个模拟量进行快速采集,这个特性不是一般的MCU具有的。

以上高性能的 ADC,配合相对比较块的指令集和一些特色的算法支持,就构成了STM32 在电机控制上的强大特性。

好了,正题,怎末做一个简单的ADC,注意是简单的,ADC 是个复杂的问题,涉及硬件设计,电源质量,参考电压,信号预处理等等问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

{ tmp=buf[j]; buf[j]=buf[j+1]; buf[j+1]=tmp; } } } if(no>5)//no 为整形,此处是将 no 的前 2/5 丢掉 { cut_no=no/5; } //平均 tmp=0; for(i=cut_no;i<no-cut_no;i++) //只取中间 n-2*cut_no 个求平均 tmp+=buf[i]; return(tmp/(no-2*cut_no)); } void delay(u32 z) { while(z--); }
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 描 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软件启动转换 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); //1 个通道
ChipOutHalInit(); //片外硬件初始化
for(;;) { if(ADC_Ok==TRUE) { ADC_Ok=FALSE; adc=DigitFilter(ADCCov,16); //滤波,只要数据的中间一段 DMAReConfig();//重新启动 DMA
adc=(1.42 - adc*3.3/4096)*1000/4.35 + 25;//转换为温度值,实际应用中,可考虑用 毫伏为单位,避免浮点运算 printf("T: %d C\r\n",adc);//可以不需要下面的那种操作,很简单的就可将数据从串口 输出!! /* a = adc/1000; b = (adc - a*1000)/100; c = (adc - a*1000 - b*100)/10; d = adc - a*1000 - b*100 - c*10;
USART1_Puts("Temprature is:"); USART1_Putc(a+'0'); USART1_Putc(b+'0'); USART1_Putc(c+'0'); USART1_Putc(d+'0'); USART1_Puts("C \r\n"); */ delay(2234567); } } }
/************************************************************** ** 函数名:DigitFilter ** 功能:软件滤波 ** 注意事项:取 NO 的 2/5 作为头尾忽略值,注意 N 要大于 5,否则不会去头尾 ***************************************************************/ u16 DigitFilter(u16* buf,u8 no) { u8 i,j; u16 tmp; u8 cut_no=0; //排序,将 buf[0]到 buf[no-1]从大到小排列 for(i=0;i<no;i++) { for(j=0;j<no-i-1;j++) { if(buf[j]>buf[j+1])
//数据右
/* 配置通道 16 的采样速度,这里因为是测温,不需要很快,配置为最慢*/ ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_23TempSensorVrefintCmd(ENABLE);
STM32+DMA+UART+ADC+内部温度传感器
说明: 说明:沧海一声笑原创。 沧海一声笑原创。 邮箱: 邮箱:minios@
由于文件很多, 由于文件很多,只列举几个关键的文件。 只列举几个关键的文件。 ADC.c #include "STM32Lib\\stm32f10x.h" u16 ADCCov[16]; volatile bool ADC_Ok=FALSE; static DMA_InitTypeDef DMA_InitStructure; static ADC_InitTypeDef ADC_InitStructure;
//设定外设数据宽度为 16 位 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //半字 //普通模式 //高优先级 //非内存到内 //设定 DMA 的工作模式普通模式,还有一种是循环模式 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //设定 DMA 通道的软件优先级 DMA_InitStructure.DMA_Priority = DMA_Priority_High; //使能 DMA 内存到内存的传输,此处没有内存到内存的传输 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; 存 DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); 道 1 传输完成中断 //DMA 通
//DMA 的配置 void DMA_Configuration(void) { /* 允许 DMA1 */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* DMA 通道 1*/ DMA_DeInit(DMA1_Channel1); //指定 DMA 外设基地址 DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)( &(ADC1->DR)); //ADC1 数据寄存器 //设定 DMA 内存基地址 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADCCov; ADC 的数组 //外设作为数据传输的来源 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; 作源头 //指定 DMA 通道的 DMA 缓存大小 DMA_InitStructure.DMA_BufferSize = 16; //外设地址不递增(不变) DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不增加 //内存地址不递增(不变) DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 内存地址增加 // //每次 DMA16 个数据 //片内外设 //获取
} main.c /************************************************************ **实验名称:ADC TEMP **功能:使用片内的温度传感器测量温度,并通过串口输出温度值 *************************************************************/ #include "STM32Lib\\stm32f10x.h" #include "hal.h" #include "stdio.h" extern volatile bool ADC_Ok; extern u16 ADCCov[16]; extern void DMAReConfig(void); void delay(u32 z); u16 DigitFilter(u16* buf,u8 no); int fputc(int ch, FILE *f) { //USART_SendData(USART1, (u8) ch); USART1->DR = (u8) ch; /* Loop until the end of transmission */ while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) { } return ch; } int main(void) { u16 adc; u8 a,b,c,d; ChipHalInit(); //片内硬件初始化
/* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); } //重新允许 DMA, void DMAReConfig(void) { DMA_DeInit(DMA1_Channel1); DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); DMA_Cmd(DMA1_Channel1, ENABLE); } stm32f10x_it.c /* Includes ------------------------------------------------------------------*/ #include "STM32Lib\\stm32f10x.h" #include "hal.h" extern volatile bool ADC_Ok; void DMA1_Channel1_IRQHandler(void) { if(DMA_GetITStatus(DMA1_IT_TC1))//通道 1 传输完成中断 { DMA_ClearITPendingBit(DMA1_IT_GL1); //清除全部中断标志 ADC_Ok=TRUE; }
相关文档
最新文档