OpenEdv-开源电子网

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

设置ADC 的DMA模式怎么转换出来的值是零啊,崩溃了

[复制链接]

79

主题

233

帖子

0

精华

高级会员

Rank: 4

积分
658
金钱
658
注册时间
2012-10-21
在线时间
45 小时
发表于 2015-8-19 21:34:56 | 显示全部楼层 |阅读模式
5金钱
#include "stm32f10x.h"
#include  "io.h"
#include  "adc.h"
#include  "dma.h"
 float AD_Value[10][3],AD_After_Filter[3],sum ,num ;
 float current,votaget,temperature;
 void Average_value(void);  //求平均值函数 
 /*主函数*/
int main(void)
{
    SystemInit();     //初始化系统时钟
    DMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)AD_Value,30);//DMA1通道1初始化配置  
    adc_Init();//初始化ADC转换器
while (1)
{
/********************************************************************/
/*数据处理函数——电流。电压。温度。主机,备机,有车,无车,装入相应数*/ 
/*                          据帧                                    */                       
/****************************************************************** */
if(DMA_GetFlagStatus(DMA1_FLAG_TC1)!=RESET)//判断DMA是否转换完毕
{  
// Average_value();             // 进行10次电流,电压,温度平均值的计算
DMA_ClearFlag(DMA1_FLAG_TC1)  ;// 清除标志位
current =(2.5- AD_After_Filter[0]/1365)/0.066;//计算实际电流值
votaget        =    4*AD_After_Filter[1]/1365 ;//计算电压值 //取出电流整数部分赋值给数据帧数组
temperature=(1.43-AD_After_Filter[2]/1365)/0.0043+25;   //计算出当前温度值
}
}
  /**************************************************/
 /* 平均值函数——计算电流,电压,温度,10次的平均值 */                       
/**************************************************/
void Average_value()
{
u8 count,i ;
for(i=0;i<3;i++)
{
for ( count=0;count<10;count++)
sum=sum+ AD_Value[count];

AD_After_Filter=sum/10;     
}  
上面是主函数,下面是DMA配置
void DMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr) 
{
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //使能 DMA时钟
    DMA_DeInit(DMA_CHx);//将DMA的通道1寄存器重设为缺省值
  DMA1_MEM_LEN=cndtr; 
    DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;//DMA外设ADC 基地址
  DMA_InitStructure.DMA_MemoryBaseAddr = cmar;   //DMA 内存基地址
  DMA_InitStructure.DMA_DIR =  DMA_DIR_PeripheralSRC; //数据传输方向外设到内存 
  DMA_InitStructure.DMA_BufferSize = cndtr;   //DMA 通道的DMA缓存的大小
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不变
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址寄存器递增
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord ; //外设数据宽度为16位
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //内存数据宽度为16位 
  DMA_InitStructure.DMA_Mode =  DMA_Mode_Circular ;  //工作在循环模式 
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA 通道x拥有中优先级
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //非内存到内存传输
  DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据指定的参数初始化
  DMA_Cmd(DMA_CHx, ENABLE);
}
下面是ADC配置 
void adc_Init()
{
  ADC_InitTypeDef ADC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
/*使能GPIOB和ADC1的时钟*/ 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_ADC1, ENABLE);

/*设置ADC分频因子6 ,72M/6=12,ADC最大时间不能超过14M*/
  RCC_ADCCLKConfig(RCC_PCLK2_Div6); 

  /*PB0和PB1作为模拟通道输入引脚*/
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1;//PB0位电流模拟输入PB1为电压模拟输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB0和PB1
ADC_DeInit(ADC1); //复位ADC1,将外设ADC1的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE ; //使能扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE ; //开启连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//转换由软件启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel =3; //顺序进行规则转换的ADC通道的数为3
ADC_Init(ADC1, &ADC_InitStructure); //根据指定的参数初始化外设ADC1
ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器
 ADC_DMACmd(ADC1, ENABLE) ;      //开启ADC的DMA功能
ADC_Cmd(ADC1, ENABLE);  //使能指定的ADC1
ADC_ResetCalibration(ADC1);//执行复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1);//执行校准
while(ADC_GetCalibrationStatus(ADC1));     //等待校准结束
ADC_RegularChannelConfig(ADC1,ADC_Channel_8, 1, ADC_SampleTime_239Cycles5 );//采样时间为21微妙---电流采样
ADC_RegularChannelConfig(ADC1,ADC_Channel_9, 2, ADC_SampleTime_239Cycles5 );//采样时间为21微妙---电压采样
ADC_RegularChannelConfig(ADC1,ADC_Channel_16, 3, ADC_SampleTime_239Cycles5 );//采样时间为21微妙---温度采样
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
 
}

请大家帮我看看 ,怎么AD_After_Filter[3]里的值都是零呢,我仿真的时候进入置位后的DMA处理函数
也就是处理电流 电压的那个函数 ,确认数组确实为0,不知道为什么



                         

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

79

主题

233

帖子

0

精华

高级会员

Rank: 4

积分
658
金钱
658
注册时间
2012-10-21
在线时间
45 小时
 楼主| 发表于 2015-8-19 21:50:42 | 显示全部楼层
回复

使用道具 举报

79

主题

233

帖子

0

精华

高级会员

Rank: 4

积分
658
金钱
658
注册时间
2012-10-21
在线时间
45 小时
 楼主| 发表于 2015-8-19 22:02:57 | 显示全部楼层
有没有人帮下忙啊
回复

使用道具 举报

79

主题

233

帖子

0

精华

高级会员

Rank: 4

积分
658
金钱
658
注册时间
2012-10-21
在线时间
45 小时
 楼主| 发表于 2015-8-20 05:47:26 | 显示全部楼层
哎哎哎,求求您么帮帮我啊
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-11-16
在线时间
0 小时
发表于 2015-8-20 16:19:20 | 显示全部楼层
你的dma配置的是循环模式,是不是不会产生标志位,你改成正常模式试试。
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-11-16
在线时间
0 小时
发表于 2015-8-20 16:32:44 | 显示全部楼层
回复【5楼】月夜漂泊:
---------------------------------
试了下能读出来,楼主自己耐心检查吧
回复

使用道具 举报

79

主题

233

帖子

0

精华

高级会员

Rank: 4

积分
658
金钱
658
注册时间
2012-10-21
在线时间
45 小时
 楼主| 发表于 2015-8-20 19:48:27 | 显示全部楼层
回复【6楼】月夜漂泊:
---------------------------------
嗯好的我试试
回复

使用道具 举报

79

主题

233

帖子

0

精华

高级会员

Rank: 4

积分
658
金钱
658
注册时间
2012-10-21
在线时间
45 小时
 楼主| 发表于 2015-8-20 19:53:36 | 显示全部楼层
回复【6楼】月夜漂泊:
---------------------------------还是零,都快无语了,我都检查还几遍了,要不也不能麻烦大家啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 07:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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