STM32 之 ADC_DMA
再次重申STM32的ADC不同的通道对应着不同的管脚,本代码中PA1对应着通道1。
包含文件:
由于百度字数限制这里只贴出关键代码:
(1)Main
C语言:Codee#14684
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 实验平台 : ST 官方三合一套件
+ 硬件 : STM32F103C8T6
+ 开发平台 : IAR For ARM 5.40
+ 仿真器 : J-Link
+ 日期 : 2010-10-28
+ 频率 :HSE = 8MHz ,主频 = 72MHz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
#include "includes.h"
#include "stdio.h"
/*******************************************************************************
== 变量声明 ==
*******************************************************************************/
floatADC_Value,Tem;
unsignedchara=0;
unsignedcharb=0;
unsignedcharc=0;
unsignedchard=0;
/*******************************************************************************
== Main 函数 ==
*******************************************************************************/
voidmain(void)
{
//---- 初始化 ------------------------------------------------------
RCC_Configuration();//配置系统时钟
NVIC_Configuration();//配置 NVIC 和 Vector Table
SysTick_Config();//配置SysTick的精确延时
GPIO_Configuration();
UART1_Configuration();
AD_Configration();
DMA_Configration();
//---- 任务开始 ----------------------------------------------------
LED1_HIGH;LED2_HIGH;LED3_HIGH;LED4_HIGH;// 初始化让灯全灭
Uart1_PutString("===== 豆子 STM32例程之ADC_DMA =====\r\n",39);
while(1)
{
ADC_Value=(float)(sys_analog[5])*330/409600;// 计算公式datasheet上可以找到,但是我没找到。
// Tem = (1.42 - ADC_Value)*1000/4.35 + 25;
ADC_Value=ADC_Value*1000;// ADC是12位的,这里数据类型转换有问题
a=ADC_Value/1000;
b=(ADC_Value-a*1000)/100;
c=(ADC_Value-a*1000-b*100)/10;
d=ADC_Value-a*1000-b*100-c*10;
Uart1_PutChar(a+0);
Uart1_PutString(".",1);
Uart1_PutChar(b+0);
Uart1_PutChar(c+0);
Uart1_PutChar(d+0);
Uart1_PutString(" V\n",3);
Delay_Ms(1000);
}
}
(2)ADC初始化
C语言:Codee#14685
/*******************************************************************************
* Function Name : AD_Configration
* Description : Configures the ADC1
* Input : None
* Output : None
* Return : None
*******************************************************************************/
voidAD_Configration(void)
{
ADC_InitTypeDefADC_InitStructure_ADC1;
/* Resets ADC1 */
ADC_DeInit(ADC1);
ADC_InitStructure_ADC1.ADC_Mode=ADC_Mode_Independent;// 配置ADC1 工作在独立模式
ADC_InitStructure_ADC1.ADC_ScanConvMode=ENABLE;// 配置ADC1 模数转换工作在扫描模式(多通道模式)
ADC_InitStructure_ADC1.ADC_ContinuousConvMode=ENABLE;// 配置ADC1 模数转换工作在连续模式
ADC_InitStructure_ADC1.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;// 配置ADC1 模数转换有软件方式启动而非中断方式
ADC_InitStructure_ADC1.ADC_DataAlign=ADC_DataAlign_Right;// 配置ADC1 模数转换数据对齐方式为右对齐
ADC_InitStructure_ADC1.ADC_NbrOfChannel=1;// 配置ADC1 模数转换的通道数目 为 1个通道
ADC_Init(ADC1,&ADC_InitStructure_ADC1);// 配置ADC1 初始化
//常规转换序列1:通道10
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);// 配置为 ADC1,通道1,1个通道,采样时间为239.5个周期,周期越长采集的信号越准越稳
// 对应的管教所对应的ADC通道时对应的,一定不要搞错!
/* Enable the temperature sensor and vref internal channel */
//ADC_TempSensorVrefintCmd(ENABLE); // 使能温度传感器内部参考电压通道
ADC_DMACmd(ADC1,ENABLE);// 使能ADC1的DMA请求
ADC_Cmd(ADC1,ENABLE);// 使能ADC1
/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1);// 重置ADC1的校准寄存器
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));// 检测是否重置完毕
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);// 开始校准 ADC1
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));// 检测是否校准完毕
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1,ENABLE);// 软件使能ADC1的转换
}
STM32ADCDM 相关文章:
- STM32 ADC与DMA多通道处理(12-03)
- STM32_ADC+DMA(12-02)
- STM32的ADC DMA USART综合学习(12-02)
- STM32笔记(三)ADC、DMA、USART的综合练习(11-28)
- STM32 ADC结合DMA数据采样与软件滤波处理(11-17)
- Windows CE 进程、线程和内存管理(11-09)