OpenEdv-开源电子网

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

STM32 中ADC转换通道问题有个疑问

[复制链接]

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
发表于 2014-6-19 09:55:29 | 显示全部楼层 |阅读模式
5金钱
GPIOC->CRL&=0XFFFFFFF0;//Pc.0 anolog输入  

ADC1->SQR3&=0XFFFFFFE0;//规则序列1=通道0 
ADC1->SQR3|=0XFFFFFFE0;
这里为什么是PA0口哪??
ADC1->SQR3|=0XFFFFFFE1;
为什么是这里为什么是PA1口哪??

我想把PC口作为输入该怎么设置今天一上午了没看明白郁闷ing。。。。。

#include <stm32f10x_lib.h>
#include "adc.h"
//#include "dma.h"
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3   
void  Adc_Init(void)
{        
RCC->APB2ENR|=1<<4;    //使能PORTc口时钟  
GPIOC->CRL&=0XFFFFFFF0;//Pc.0 anolog输入  
//通道10/11设置   
RCC->APB2ENR|=1<<9;    //ADC1时钟使能 
__nop();
__nop();      
RCC->APB2RSTR|=1<<9;   //ADC1复位 
RCC->APB2RSTR&=~(1<<9);//复位结束   
RCC->CFGR|=3<<14;      //SYSCLK/DIV2=88M/8=11Mhz 得到ADC采样率位43.65Khz    
  
ADC1->CR1&=0XF0FFFF;   //独立工作模式 
ADC1->CR1|=1<<8;       //扫描模式    
ADC1->CR2|=1<<1;       //连续转换模式  
ADC1->CR2|=0x000E0000; //软件控制转换 由bit21控制 
ADC1->CR2|=1<<20;      //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发 
ADC1->CR2&=~(1<<11);   //右对齐 
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1&=0<<20;     //1个转换在规则序列中 也就是只转换规则序列1  
ADC1->SQR3&=0XFFFFFFE0;//规则序列1=通道0 
ADC1->SQR3|=0XFFFFFFE1; 怎么成了PA1??
ADC1->SQR3|=0XFFFFFFE0; 怎么成了PA0??

//   ADC1->SQR3|=1<<0;
 
ADC1->SMPR1|=0XFFFFFFF0;     //通道0的转换时间为:239.5+12.5个ADC时钟周期 
ADC1->SMPR1|=7<<0;      //通道0  239.5周期,提高采样时间可以提高精确度   
ADC1->CR2|=1<<0;       //开启AD转换器,第一次唤醒AD转换器   
ADC1->CR2|=1<<3;       //使能复位校准   
while(ADC1->CR2&1<<3); //等待校准结束    
    //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。     
ADC1->CR2|=1<<2;       //开启AD校准     
while(ADC1->CR2&1<<2); //等待校准结束 
//该位由软件设置以开始校准,并在校准结束时由硬件清除     
      
}  
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
//设置转换序列    
ADC1->SQR3&=0XFFFFFFE0;//规则序列1 通道ch
ADC1->SQR3|=ch;      
ADC1->CR2|=1<<22;       //启动规则转换通道 
while(!(ADC1->SR&1<<1));//等待转换结束   
return ADC1->DR; //返回adc值
}

#include "stm32f10x_lib.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "lcd.h"
#include "adc.h"
#include "dma.h"   
void  Uart1_PutChar(u8 ch);
void Uart1_PutString(u8 *Buf, u8 Len);
int main(void) 
{     
float temp=0;
u16 t;
u32 temp1 =0;
u32 adcx; 
u8 table[6];
u8 *p;
p= table;
Stm32_Clock_Init(9);//88M 
delay_init(72);     //延时初始化  
uart_init(72,9600);
LCD_Init();
POINT_COLOR=RED;//设置字体为红色 

//显示提示信息
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:");
LCD_ShowString(60,150,200,16,16,"ADC_CH0_VOL:0.000V");
Adc_Init();
MYDMA_Config(DMA1_Channel1,(u32) &ADC1->DR);//配置DMA通道1 
ADC1->CR2|=1<<8;    //开启ADC DMA转换 
ADC1->CR2|=1<<0;    //开启AD转换 
MYDMA_Enable(DMA1_Channel1);//开启DMA通道1  
  while (1) 
    { 
   if(DMA1->ISR&(1<<1)) //传输完成了 
{  
for(t=0;t<5;t++)
{
temp1 = temp1 + ADC_Buf[t];

adcx = temp1/5;
LCD_ShowNum(156,130,adcx,4,16);//显示ADC的值
temp=(float)adcx*(3.3/4096);
adcx=temp;
LCD_ShowNum(156,150,adcx,1,16);//显示电压值
temp-=adcx;
temp*=1000;
LCD_ShowNum(172,150,temp,3,16);
table[0]=adcx+0x30;
table[1]='.';
table[2]=(int)temp / 100 + 0x30;
table[3]=(int)temp % 100/10 + 0x30;
table[4]=(int)temp %10 + 0x30;
table[5]='V';
Uart1_PutString(p,6);
Uart1_PutString("\r\n",2);
temp1 =0;
DMA1->IFCR|=1<<1;
delay_ms(1000);
MYDMA_Enable(DMA1_Channel1);

             
    }  
               
 }  

void  Uart1_PutChar(u8 ch)
{
USART1->DR = (u8) ch;  
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕  
}

void Uart1_PutString(u8 *Buf, u8 Len)
{
u8 i;
for(i= 0; i<Len; i++)
{
Uart1_PutChar(*Buf++);
}
}


adc+dma.rar

1.41 MB, 下载次数: 487

最佳答案

查看完整内容[请看2#楼]

你去看下datasheet,ADCx->SQR寄存器是用来设置ADC通道转换顺序的 SQR3的bit0~boit4用来设置第一个转换的通道,有可能是channel0,channel1....channel16 所以你把SQR3寄存器设置成 ADC1->SQR3|=0XFFFFFFE0的话 第一个转换的通道当然是通道0(PA0)了 而如果你把SQR3寄存器设置成ADC1->SQR3|=0XFFFFFFE1的话,那你第一个转换的通道当然是通道1(PA1)了 而你讲的要把PC0做ADC的输入的话,因为PC0是ADC的通道10,所以你 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
发表于 2014-6-19 09:55:30 | 显示全部楼层
你去看下datasheet,ADCx->SQR寄存器是用来设置ADC通道转换顺序的
SQR3的bit0~boit4用来设置第一个转换的通道,有可能是channel0,channel1....channel16
所以你把SQR3寄存器设置成 ADC1->SQR3|=0XFFFFFFE0的话 第一个转换的通道当然是通道0(PA0)了
而如果你把SQR3寄存器设置成ADC1->SQR3|=0XFFFFFFE1的话,那你第一个转换的通道当然是通道1(PA1)了

而你讲的要把PC0做ADC的输入的话,因为PC0是ADC的通道10,所以你要将SQR3寄存器设置成ADC1->SQR3|=0XFFFFFFEA;这样应该就可以了
天道酬勤
回复

使用道具 举报

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
 楼主| 发表于 2014-6-19 09:55:30 | 显示全部楼层
 奥 明白了脑子一时转不过来呵呵根据这个图看明白了呵呵 谢谢了各位

回复

使用道具 举报

8

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2014-6-6
在线时间
3 小时
发表于 2014-6-19 10:07:44 | 显示全部楼层
贴一下完整的ADC程序
回复

使用道具 举报

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
 楼主| 发表于 2014-6-19 13:05:10 | 显示全部楼层
回复【2楼】ElecUtopia:
---------------------------------
贴上了 麻烦看下谢谢!!
怎么确定是那个端口啊??
回复

使用道具 举报

8

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2014-6-6
在线时间
3 小时
发表于 2014-6-19 13:33:06 | 显示全部楼层
回复【3楼】shenhao7752376:
---------------------------------
估计你是要传到DMA 那里吧。  
那么你看参考手册的ADC_SQR3 介绍。
另外PC0好像是通道10的,  所以说一个转换序列在通道10 
ADC->SQR3=0xffffffEA; 而不是E1(E1是通道1)。
改一下这里估计成了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 00:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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