OpenEdv-开源电子网

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

ADC采样中的问题

[复制链接]

15

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2012-4-3
在线时间
13 小时
发表于 2014-1-9 20:06:25 | 显示全部楼层 |阅读模式
    做了一个利用库函数ADC采集的程序,发现采集到的变量值无法赋值给其他变量,请各位高手指教,如下代码:
#include "stm32f10x.h"
#include "system_stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "usart14.h"
#include "relay.h"
#include "misc.h"
#include "public.h"
#include "O2_chack.h"

#define ADC1_DR_Address    ((u32)0x40012400+0x4c)
u16 ADC_ConvertedValue;
u16 ADC_ConvertedValueLocal;
/*
*函数名:O2_ADC_GPIO_Config
*描述:  使能ADC1和DMA时钟,初始化PC1
*输入:  无
*输出:  无
*调用:  内部调用
*/
static void O2_ADC_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;      

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOC,&GPIO_InitStructure);
}

/*
*函数名:O2_ADC_Mode_Config
*描述:  配置ADC的工作模式
*输入:  无
*输出:  无
*调用:  内部调用
*/

static void O2_ADC_Mode_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;//内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 1;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;  //内存地址固定
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环传输
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
/* Enable DMA channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);


ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立ADC模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE ; //禁止扫描模式,扫描模式用于多通道采集
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续转换模式,即不停地进行ADC转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部触发转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //采集数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //要转换的通道数目1
ADC_Init(ADC1, &ADC_InitStructure);
/*配置ADC时钟,为PCLK2的8分频,即9Hz*/
RCC_ADCCLKConfig(RCC_PCLK2_Div8); 
/*配置ADC1的通道11为55. 5个采样周期,序列为1 */ 
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/*复位校准寄存器 */   
ADC_ResetCalibration(ADC1);
/*等待校准寄存器复位完成 */
while(ADC_GetResetCalibrationStatus(ADC1));
/* ADC校准 */
ADC_StartCalibration(ADC1);
/* 等待校准完成*/
while(ADC_GetCalibrationStatus(ADC1));
/* 由于没有采用外部触发,所以使用软件触发ADC转换 */ 
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}


/*初始化ADC*/
void O2_ADC_Init(void)
{
O2_ADC_GPIO_Config();
O2_ADC_Mode_Config();
}

void Get_ADC_O2(void)
{
int a;
for(a=0;a<10;a++)
{
ADC_ConvertedValueLocal = (float)ADC_ConvertedValue/4096*2.5; 
TX_Command_Display_O2[6]=ADC_ConvertedValueLocal&0x00ff;
TX_Command_Display_O2[7]=(ADC_ConvertedValueLocal&0xff00)>>8;
}
}。
标红处ADC采集到的ADC_ConvertedValue有值,但是无法赋值给ADC_ConvertedValueLocal。
其中 void Get_ADC_O2(void)函数在主函数循环调用。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2014-1-9 21:26:16 | 显示全部楼层
首先不说其他问题,就函数的命名上有点奇葩了。还有(float)转化了,最后得到的还是U16。
最后说你的问题,无法赋值,这个真没遇到过。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 10:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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