STM32+DMA+UART+ADC+内部温度传感器
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(模拟数字转换器)模块可以将模拟
信号转换为数字信号。
ADC是一种重要的外设,用于从外部
传感器或其他模拟源获取数据。
ADC模块的工作包括采样、保持、量化和序列转换等过程。
首先,ADC模块会接收来自外部模拟信号的输入。
这些信号
可以是来自温度传感器、光敏电阻或其他传感器的模拟信号。
接下来,ADC模块会将输入信号通过采样和保持电路进行采样。
采样是指将模拟信号转换为相应的电压值。
保持电路将输入信号的电压保持在一个稳定的水平上,以便进行后续的处理。
然后,ADC模块将采样和保持的电压值进行量化。
量化是指
将连续的模拟信号转换为离散的数字信息。
ADC模块使用一
定的分辨率来表示模拟信号,例如12位或16位。
最后,ADC模块将量化后的数字信息通过序列转换器进行处理。
序列转换器将多个信道的数字信息按照一定的顺序进行转换和存储。
转换的结果可以存储在寄存器中供CPU读取,或
者被DMA直接传输到内存中。
总结来说,STM32 ADC工作原理包括采样、保持、量化和序
列转换等步骤,将外部模拟信号转换为数字信息,以供微控制器进行进一步处理和分析。
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课件

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内部温度传感器串口显示完整程序

[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-内部温度传感器-串口显示-完整程序

程序如下:
#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 内部温度传感器

/*
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数据采样与软件滤波处理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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; }