OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3894|回复: 3

ADC1 3通道采集。。。。。。

[复制链接]

39

主题

123

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2014-11-7
在线时间
44 小时
发表于 2014-11-25 23:03:37 | 显示全部楼层 |阅读模式
[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]

再牛逼的梦想都禁不住傻逼的坚持!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

123

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2014-11-7
在线时间
44 小时
 楼主| 发表于 2014-11-25 23:05:31 | 显示全部楼层
怎么PC2还是不整齐了, 3通道采集,DMA传输,有什么疑问大家提出来一起探讨共同进步。。。。。。
再牛逼的梦想都禁不住傻逼的坚持!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-25 23:19:35 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

39

主题

123

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2014-11-7
在线时间
44 小时
 楼主| 发表于 2014-11-25 23:49:33 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
能得到原子哥的回复,莫感荣幸!!!
再牛逼的梦想都禁不住傻逼的坚持!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 17:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表