高级会员

- 积分
- 658
- 金钱
- 658
- 注册时间
- 2012-10-21
- 在线时间
- 45 小时
|
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,不知道为什么
|
|