[mw_shl_code=c,true]#include "adx335.h"
#include "stm32f10x.h"
#include "usart.h"
#define ADC1_DR_Address ((u32)0x40012400+0x4c)
#define M 10 //表示转换的次数
#define N 3 //表示通道的数目
u8 adx_X[5] = {0};
u8 adx_Y[5] = {0};
u8 adx_Z[5] = {0};
volatile u16 ADC_Converted[3] = {0,0,0};
volatile u16 ADC_ConvertedValue[10][3] = {{0,0,0},{0,0,0},{0,0,0},{0,0,0},
{0,0,0},{0,0,0},{0,0,0},{0,0,0},
{0,0,0},{0,0,0}};
/***********************************************
函数名称:void ADC1_GPIO_Init(void)
函数参数:无
返回值 :无
函数功能:ADC GPIO引脚初始化
备注 :14-08-27 联航 - 灰太狼
引脚名称标注 出现的 ADC123INx(x 表示 4~9 14~15之间的整数)
表示这个引脚可以是 ADC1INx ADC2INx ADC3INx
PC0 为 默认复用 ADC123IN10
PC1 为 默认复用 ADC123IN11
PC2 为 默认复用 ADC123IN12
PC0 PC1 PC2
使用 ADC1IN10 ADC1IN11 ADC1IN12
采用ADC1的多通道多次转化
***********************************************/
static void ADC1_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOC,ENABLE); //开启GPIOC的外设时钟
/* Configure PC0 PC1 PC2 as analog input */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //通用模拟输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; //选择 0 1 2引脚作为AD 输入
GPIO_Init(GPIOC,&GPIO_InitStructure); //PC0,PC1,PC2 输入时不用设置速率
}
/***********************************************
函数名称:void DMA_Config(void)
函数参数:无
返回值 :无
函数功能:配置DMA的寄存器
备注 :14-08-27 联航 - 灰太狼
***********************************************/
static void ADC_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
/* Enable DMA clock*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* DMA channel1 configuration */
DMA_DeInit(DMA1_Channel1);
//设置DMA源:ADC 地址
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
//内存地址:(要传输的变量的指针)
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;
//方向:从外设到内存
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
//传输大小:
DMA_InitStructure.DMA_BufferSize = M*N;
//外设地址不增
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
//内存地址增加
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
/*外设数据单位*/
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
/*内存数据单位 u16 */
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
/*DMA 模式: 一次传输,循环*/
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
/*优先级:高 */
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
/* 禁止内存到内存的传输 */
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
/*配置DMA1 的1 通道*/
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE); //使能 DMA
}
/***********************************************
函数名称:void ADC1_Mode_Init()
函数参数:无
返回值 :无
函数功能:配置 ADC 寄存器
备注 :14-08-27 联航 - 灰太狼
***********************************************/
static void ADC1_Mode_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_DeInit(ADC1); //set ADC1 register definited 外设ADC1全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;/* 独立ADC模式 */
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //扫描模式,扫描模式多用于多通道采集
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续转换模式 即不停的进行ADC 扫描
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;// 不使用外部触发转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 采集数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 3; /* 要转换的通道数目 3 */
ADC_Init(ADC1,&ADC_InitStructure); //
/* 配置ADC时钟, 为PLCK2 的8 分频,即9MHz */
//
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
/*配置ADC1 的通道10 11 12 为55.5 个采样周期 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_55Cycles5);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* 复位校准寄存器 并等待校准寄存器复位完成 */
ADC_ResetCalibration(ADC1);
while( ADC_GetResetCalibrationStatus(ADC1));
/* 开始指定ADC1的校准状态 */
ADC_StartCalibration(ADC1);
/* 获取指定ADC1的校准程序,设置状态则等待 */
while(ADC_GetCalibrationStatus(ADC1));
/*由于没有采用 外部触发,所以使用软件触发ADC 转换*/
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
void ADX335_Init(void)
{
ADC1_GPIO_Init();
ADC_DMA_Config();
ADC1_Mode_Init();
}
void ADC_Aver_Value(void)
{
u8 i = 0, j = 0;
u16 sum = 0;
for(i=0; i<N; i++)
{
for(j=0; j<M;j++)
{
sum += ADC_ConvertedValue[j];
}
ADC_Converted = sum/10;
printf("i = %d, %d\r\n",i,sum);
sum = 0;
}
}
/**************************************************************************
*name : my_itoa
*parment : p - store ascii, num - number of traverse, radix - scale(进制)
*return : none
*author : huitailang
*remark : 14-11-25 哈尔滨医科大学信息科(3号楼2层信息科)
**************************************************************************/
void my_itoa(u8 *p, short num, u16 radix)
{
u8 flag = 0, i = 0, len = 0, tmp = 0;
if(num == 0)
{
*p = '0';
*(p+1) = '\0';
return;
}
else if(num < 0 )
{
flag = 1;
num = -num;
}
while(num > 0 )
{
if(num%radix >= 10)
{
p[len] = 'a' + (num%radix - 10);
}
else if(num%radix < 10)
{
p[len] = num%radix + '0';
}
len++;
num = num/10;
}
if(flag == 1)
{
p[len] = '-';
len++;
}
p[len] = '\0';
for(i=0; i<len/2; i++)
{
tmp = p;
p = p[len-1-i];
p[len-1-i]= tmp;
}
}
void adx_x(void)
{
my_itoa(adx_X, ADC_Converted[0], 10);
printf("%s",adx_X);
}
void adx_y(void)
{
my_itoa(adx_Y, ADC_Converted[1], 10);
printf("%s",adx_Y);
}
void adx_z(void)
{
my_itoa(adx_Z, ADC_Converted[2], 10);
printf("%s\n",adx_Z);
}
/***************************************************
* 实验平台: 王松松板子 加速度传感器(修改自ADC转换)
* 硬件连接:---------------------------
* | PC0----X |
* | PC1----Y |
* | PC2----Z |
* | VCC----3.3V |
* | GND----0V |
* ---------------------------
* 库版本 :ST 3.5.0
*
* 作者 :灰太狼
* 论坛 :http://www.amobbs.com/forum-1008-1.html
* 淘宝 :http://firestm32.taobao.com
**********************************************************************************/
#ifndef __ADX335_H__
#define __ADX335_H__
#include "stm32f10x.h"
#include "data.h"
void ADX335_Init(void);
void ADC_Aver_Value(void);
void my_itoa(u8 *p, short num, u16 radix);
void adx_x(void);
void adx_y(void);
void adx_z(void);
#endif
[/mw_shl_code]
|