论坛也看过几个列子 ,根据自己理解的写的 求看看哪里出问题了,2路电压输出0!给的是3.3v
[mw_shl_code=c,true]//采集ADC1 通道1,2的电压值
#include "AD.h"
#include "delay.h"
void ADC_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PA外设时钟
GPIOA->CRL&=0xFFFFFF0F; //PA1清零
GPIOA->CRL|=0x00000000; //模拟输入
GPIOA->CRL&=0xFFFFF0FF; //PA2清零
GPIOA->CRL|=0x00000000; //模拟输入
RCC->APB2ENR|=1<<9; //ad外设时钟使能
RCC->APB2RSTR|=1<<9; //adc1 复位
RCC->APB2RSTR&=~(1<<9); //adc1 复位结束
RCC->CFGR&=~(3<<14); //预分频因子清零
RCC->CFGR|=2<<14; //六分频 12MHz
ADC1->CR1&=~(1<<8); //扫描方式清零
ADC1->CR1|=1<<8; //扫描方式
ADC1->CR1&=0xF0FFFF; //工作模式清零
ADC1->CR1|=0<<16; //独立工作模式
ADC1->CR2|=1<<8; //允许dma访问
ADC1->CR2&=~(1<<1); //单次转换模式清零
ADC1->CR2|=1<<1; //连续转换
ADC1->CR2&=~(7<<17); //启动规则转换清零
ADC1->CR2|=7<<17; //软件触发
ADC1->CR2|=~(1<<11); //右对齐
ADC1->SQR1&=~(0xF<<20); //通道数清零
ADC1->SQR1|=1<<20; //2个转换
ADC1->SMPR2&=~(7<<3); //采样时间清零
ADC1->SMPR2|=7<<3; //采样时间为239.5个周期,即ADC的转换时间T=239.5+12.5=252;
ADC1->CR2|=1<<0; //开启AD
// ADC1->CR2&=~(1<<3); //adc复位校准清零
ADC1->CR2|=1<<3; //开启复位校准
while(ADC1->CR2&1<<3); //等待复位校准结束
// ADC1->CR2&=~(1<<2); //ad校准清零
ADC1->CR2|=1<<2; //开启AD校准
while(ADC1->CR2&1<<2); //等待AD校准结束
}
u16 get_ad(u8 ch) //获取ADC->DR的数据
{
ADC1->SQR3&=0xFFFFFC00; //通道清零
ADC1->SQR3|=ch; //第ch个通道
ADC1->CR2|=1<<22; //规则通道启动(每次转换都要写1)
while(!(ADC1->SR&1<<1)); //等待ad转换结束,硬件置1
return ADC1->DR; //读取数据
}
u16 average_ad(u8 ch,u8 times)
{
u32 average_ad=0;
u8 t;
for(t=0;t<times;t++)
{
average_ad=average_ad+get_ad(ch);
delay_ms(5);
}
return average_ad/times;
}
[/mw_shl_code]
[mw_shl_code=c,true]#include "DMA.h"
#include "delay.h"
u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度
//DMA1的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHx  MA通道CHx
//cpar:外设地址
//cmar:存储器地址
//cndtr:数据传输量
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
RCC->AHBENR|=1<<0; //开启DMA1时钟
delay_ms(5); //等待DMA时钟稳定
DMA_CHx->CPAR=cpar; //DMA1 外设地址
DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址
DMA1_MEM_LEN=cndtr; //保存DMA传输数据量
DMA_CHx->CNDTR=cndtr; //DMA1,传输数据量
DMA_CHx->CCR=0X00000000; //复位
DMA_CHx->CCR|=1<<4; //从存储器读
DMA_CHx->CCR|=0<<5; //普通模式
DMA_CHx->CCR|=0<<6; //外设地址非增量模式
DMA_CHx->CCR|=1<<7; //存储器增量模式
DMA_CHx->CCR|=1<<8; //外设数据宽度为16位
DMA_CHx->CCR|=1<<10; //存储器数据宽度16位
DMA_CHx->CCR|=1<<12; //中等优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式
}
//开启一次DMA传输
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_CHx->CCR&=~(1<<0); //关闭DMA传输
DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1,传输数据量
DMA_CHx->CCR|=1<<0; //开启DMA传输
}
[/mw_shl_code]
[mw_shl_code=c,true]#include <sys.h>
#include <usart.h>
#include <delay.h>
#include <LED.h>
#include <AD.h>
#include <lcd.h>
#include <DMA.h>
#include <TIMER.h>
float temp,temp1,temp2,temp3;
u16 SendBuff[2];
int main(void)
{
u16 adcx1,adcx2;
Stm32_Clock_Init(9); //set system clock
uart_init(72,9600);
delay_init(72); //delay init
LED_Init();
LCD_Init();
// TIM3_Init(29999,7199); //3秒定时
ADC_Init();
MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)SendBuff,2); //DMA1 配置
MYDMA_Enable(DMA1_Channel1); //开启DMA
POINT_COLOR=BLUE; //字体设置成蓝色
LCD_ShowString(60,130,200,16,16,"adcx1:");
LCD_ShowString(60,150,200,16,16,"adcx2:");
LCD_ShowString(60,170,200,16,16,"average_ad1:0.000V");
LCD_ShowString(60,190,200,16,16,"average_ad2:0.000V");
while(1)
{
average_ad(ADC_CH1,15); // 获取均值
average_ad(ADC_CH2,15);
// adcx1=average_ad(ADC_CH1,15);
// adcx2=average_ad(ADC_CH2,30);
if(DMA1->ISR&(1<<1))//等待通道1传输完成
{
DMA1->IFCR|=1<<1; //清除传输完成标志
}
adcx1=SendBuff[0];
adcx2=SendBuff[1];
LCD_ShowxNum(108,130,adcx1,4,16,0); //显示ad1的值
LCD_ShowxNum(108,150,adcx2,4,16,0); //显示ad2的值
temp=(float)adcx1*(3.3/4096); //实际通道1电压值
temp2=(float)adcx2*(3.3/4096); //实际通道2电压值
temp1=temp;
adcx1=temp;
temp3=temp2;
adcx2=temp2;
LCD_ShowxNum(156,170,adcx1,1,16,0); //显示电压值
LCD_ShowxNum(156,190,adcx2,1,16,0); //显示电压值
temp=temp-adcx1;
adcx1=temp*1000;
temp3=temp2-adcx2;
adcx2=temp3*1000;
LCD_ShowxNum(172,170,adcx1,3,16,0x80); //显示完全
LCD_ShowxNum(172,190,adcx2,3,16,0x80); //显示完全
LED0=!LED0;
delay_ms(250);
}
}
[/mw_shl_code]
|