STM32+DMA+UART+ADC+内部温度传感器
- 格式:pdf
- 大小:72.54 KB
- 文档页数:6
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(模拟数字转换器)模块可以将模拟
信号转换为数字信号。
ADC是一种重要的外设,用于从外部
传感器或其他模拟源获取数据。
ADC模块的工作包括采样、保持、量化和序列转换等过程。
首先,ADC模块会接收来自外部模拟信号的输入。
这些信号
可以是来自温度传感器、光敏电阻或其他传感器的模拟信号。
接下来,ADC模块会将输入信号通过采样和保持电路进行采样。
采样是指将模拟信号转换为相应的电压值。
保持电路将输入信号的电压保持在一个稳定的水平上,以便进行后续的处理。
然后,ADC模块将采样和保持的电压值进行量化。
量化是指
将连续的模拟信号转换为离散的数字信息。
ADC模块使用一
定的分辨率来表示模拟信号,例如12位或16位。
最后,ADC模块将量化后的数字信息通过序列转换器进行处理。
序列转换器将多个信道的数字信息按照一定的顺序进行转换和存储。
转换的结果可以存储在寄存器中供CPU读取,或
者被DMA直接传输到内存中。
总结来说,STM32 ADC工作原理包括采样、保持、量化和序
列转换等步骤,将外部模拟信号转换为数字信息,以供微控制器进行进一步处理和分析。
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”。
[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 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 是个复杂的问题,涉及硬件设计,电源质量,参考电压,信号预处理等等问题。
stm32将内部温度传感器的值转为温度的方法将STM32内部温度传感器的值转为温度简介在STM32微控制器内部集成了一个温度传感器,可以用来测量芯片的温度。
然而,这个传感器给出的是一个原始的ADC值,需要进行计算才能得到真实的温度值。
本文将介绍几种常见的方法,用于将STM32内部温度传感器的值转换为温度。
1. 直接采用处理器内部的温度传感器值转换公式步骤:1.读取温度传感器值:在STM32微控制器上,可以通过读取内部参考电压(Vref)和温度传感器的原始ADC值(ADC_value)来获取温度传感器值。
2.计算温度:将原始的ADC值通过一定的公式转换为温度值:Temperature = ((Vref - V_sense) / Avg_Slope) + 25。
其中,Avg_Slope是传感器的平均斜率,V_sense是传感器的电压值。
优点:•实现简单,只需要进行简单的计算即可得到温度值。
•精度较高,可以满足大多数应用场景的需求。
缺点:•依赖于传感器的平均斜率值,可能存在一定的误差。
•无法在实时应用中获得温度值,需要额外的计算和处理。
2. 使用查找表法进行温度转换步骤:1.创建温度查找表:首先,先使用外部传感器测量一系列温度值,并将这些温度值与相应的传感器原始ADC值建立对应关系,得到一张温度查找表。
2.读取温度传感器值:同样地,通过读取内部参考电压(Vref)和温度传感器的原始ADC值(ADC_value)来获取温度传感器值。
3.查找温度:根据传感器原始ADC值,在温度查找表中找到对应的温度值。
优点:•可以提高温度转换的精度和准确性。
•可以在实时应用中获得温度值,无需额外的计算和处理。
缺点:•需要额外的传感器测量和建立温度查找表的过程,增加了开发和测试的工作量。
•如果温度传感器的特性发生改变,需要重新生成温度查找表。
3. 使用温度传感器标定法进行温度转换步骤:1.进行温度传感器标定:使用外部精准度较高的温度传感器进行对比测量,记录传感器原始ADC值和实际温度值的对应关系。
1、STM32的DAC转换是什么开始的呢?问:STM32的DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢?答:DAC是通过写入DAC输出寄存器开始的。
另外,如果想要脉冲,使用TIM功能。
2、STM32的DAC输出电压问:DAC的输出电压是如何调节的呢,输入的数字量和输出的电压怎么不成比例呢,输出电压不符合数据手册上提供的公式(DAC输出= VREF X DOR / 4095),求高人指点,程序如下:#include "stm32f10x_lib.h"#define DAC_DHR8R1_Address 0x40007410DAC_InitTypeDef DAC_InitStructure;DMA_InitTypeDef DMA_InitStructure;ErrorStatus HSEStartUpStatus;uc8 Escalator8bit[50] = {0x0, 0x33, 0x66, 0x99, 0xcc, 0xff};void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);void Delay(vu32 nCount);int main(void){#ifdef DEBUGdebug();#endifRCC_Configuration();GPIO_Configuration();NVIC_Configuration();TIM_PrescalerConfig(TIM6, 0xF, TIM_PSCReloadMode_Update);TIM_SetAutoreload(TIM6, 0xFF);TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;DAC_Init(DAC_Channel_1, &DAC_InitStructure);DMA_DeInit(DMA2_Channel3);DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Escalator8bit;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;DMA_InitStructure.DMA_BufferSize = 6;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA2_Channel3, &DMA_InitStructure);DMA_Cmd(DMA2_Channel3, ENABLE);DAC_Cmd(DAC_Channel_1, ENABLE);DAC_DMACmd(DAC_Channel_1, ENABLE);TIM_Cmd(TIM6, ENABLE);while (1){}}void RCC_Configuration(void){RCC_DeInit();RCC_HSEConfig(RCC_HSE_ON);HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS){FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK2Config(RCC_HCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);RCC_PLLCmd(ENABLE);while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while(RCC_GetSYSCLKSource() != 0x08){}}RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);}void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);}void NVIC_Configuration(void){#ifdef VECT_TAB_RAMNVIC_SetVectorTable(NVIC_V ectTab_RAM, 0x0);#else /* VECT_TAB_FLASH */NVIC_SetVectorTable(NVIC_V ectTab_FLASH, 0x0);#endif}void Delay(vu32 nCount){for(; nCount != 0; nCount--);}输出电压为什么不是0~3.3V呢?答1:(u32)&Escalator8bit;你把这个里面的数据强制转换为32位,也就是0x0, 0x33, 0x66, 0x99转换为一个32位的数据,你这样做是不对的。