您的位置 首页 测评

STM32 之 ADC_DMA

这里仅仅是一个测量趋势,并不是很精确的测量。再次重申STM32的ADC不同的通道对应着不同的管脚,本代码中PA1对应着通道1。包含文件:由于百…

这儿仅仅是一个丈量趋势,并不是很准确的丈量。

再次重申STM32ADC不同的通道对应着不同的管脚,本代码中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();//装备 NV%&&&&&% 和 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的转化
}

(3)DMA初始化

C言语:Codee#14686

/*******************************************************************************
* Function Name : DMA_Config
* Description : Configures SysTick
* Input : None
* Output : None
* Return : None
*******************************************************************************/
voidDMA_Configration(void)
{
DMA_InitTypeDefDMA_InitStructure_DMA1;

DMA_DeInit(DMA1_Channel1);// 装备DMA1 的通道1寄存器为缺省值

DMA_InitStructure_DMA1.DMA_PeripheralBaseAddr=0x4001244C;// 装备DMA1 外设基地址为 0x4001244C , 在datasheet上能够查到
DMA_InitStructure_DMA1.DMA_MemoryBaseAddr=(unsignedint)(&sys_analog);// 装备DMA1 内存基地址
DMA_InitStructure_DMA1.DMA_DIR=DMA_DIR_PeripheralSRC;// 装备DMA1 外设作为数据传输的来历 ,便是外设向内存中转移数据
DMA_InitStructure_DMA1.DMA_BufferSize=10;// 装备DMA1 数据缓存巨细为 10个数据单位
DMA_InitStructure_DMA1.DMA_PeripheralInc=DMA_PeripheralInc_Disable;// 装备DMA1 外设地址寄存器不变
DMA_InitStructure_DMA1.DMA_MemoryInc=DMA_MemoryInc_Enable;// 装备DMA1 内存地址寄存器递加
DMA_InitStructure_DMA1.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;// 装备DMA1 外设数据宽度为 16位 ,这儿留意ADC是12位的
DMA_InitStructure_DMA1.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;// 装备DMA1 内存数据宽度为 16位
DMA_InitStructure_DMA1.DMA_Mode=DMA_Mode_Circular;// 装备DMA1 作业在循环缓存形式
DMA_InitStructure_DMA1.DMA_Priority=DMA_Priority_Medium;// 装备DMA1 的相应通道(channel x)的优先级为 中优先级
DMA_InitStructure_DMA1.DMA_M2M=DMA_M2M_Disable;// 装备DMA1 的相应通道(channel x)内存到内存传输为 使能状况

DMA_Init(DMA1_Channel1,&DMA_InitStructure_DMA1);// 初始化 DMA1_Channel1 的相关寄存器

DMA_Cmd(DMA1_Channel1,ENABLE);// 使能 DMA1_Channel1

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/252215.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部