我的单通道的单次转化模式可以行得通,但是,我的单通道的连续转化模式行不通,求解.......
在寄存器设置中,其两者的区别是:
<1>将单次转化模式改为了连续转化模式
<2>之前在单通道的每次转化之后,都让其再次开启开始转化规则通道,
现在换成了连续转化模式之后,只在ADC的初始化函数部分初始化一次
开始转化规则通道,但是程序下载进去,没有反应,为何?捣鼓了好久还是没有找出原因
以下是我的单通道的连续转化模式的代码:
adc.c
[mw_shl_code=c,true]#include "sys.h"
#include "stm32f4xx.h"
/*
本实验的目的是:
通过ADC1的通道6来进行AD转化实验;
通过其采集电压值将其显示在串口上;
*/
//ADC相关的初始化;
void ADC_Init(void){
/**********************单次转化模式的初始化*****************************/
// //第一步
// //开启PA口时钟,并设置PA6为模拟输入
// RCC->AHB1ENR |= 1;
// GPIOA->MODER |= 3<<12;
//
//
// //第二步
// //使能ADC1时钟,并设置分频因子
// //ADC的时钟要低于36MHZ,具体见数据手册说明;
// RCC->APB2ENR |= 1<<8;
//
// ADC->CCR |= 3<<16; //4分频,那么ADC1的频率为21MHZ
//
// // //第三步
// // //设置ADC1的工作模式
// // //见第五步
// //
// // //第四步
// // //设置ADC1规则序列的相关信息
// ADC1->SQR3 |= 0X6; //在主函数中已经有了其配置
// //
// // //第五步
// // //开启AD转化器 //在这里设置为单次转化模式;
// //
// ADC1->CR2 &= ~(1<<11);
// ADC1->CR2 |= (1<<0);
// ADC1->CR2 |= (1<30);
/************************单次转化模式的初始化***************************/
/*********************************************************************/
// //先初始化IO口
// RCC->APB2ENR|=1<<8; //使能ADC1时钟
// RCC->AHB1ENR|=1<<0; //使能PORTA时钟
// GPIO_Set(GPIOA,PIN6,GPIO_MODE_AIN,0,0,GPIO_PUPD_PU); //PA5,模拟输入,下拉
// RCC->APB2RSTR|=1<<8; //ADCs复位
// RCC->APB2RSTR&=~(1<<8); //复位结束
// ADC->CCR=3<<16; //ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz
//
// ADC1->CR1=0; //CR1设置清零
// ADC1->CR2=0; //CR2设置清零
// ADC1->CR1|=0<<24; //12位模式
// ADC1->CR1|=0<<8; //非扫描模式
// ADC1->CR2&=~(1<<1); //单次转换模式,使用默认值即可;
// //ADC1->CR2&=~(1<<11); //右对齐 ,使用默认值即可;
// ADC1->CR2|=0<<28; //软件触发
// ADC1->SQR1&=~(0XF<<20);
// ADC1->SQR1|=0<<20; //1个转换在规则序列中 也就是只转换规则序列1
//设置通道5的采样时间
// ADC1->SMPR2&=~(7<<(3*5));//通道5采样时间清空
// ADC1->SMPR2|=7<<(3*5); //通道5 480个周期,提高采样时间可以提高精确度
// ADC1->CR2|=1<<0; //开启AD转换器
/******************************连续转化模式*******************************/
//连续转化这一部分还有问题,待完成:
// //第一步
//开启PA口时钟,并设置PA6为模拟输入
RCC->AHB1ENR |= 1;
GPIOA->MODER |= 3<<12;
//第二步
//使能ADC1时钟,并设置分频因子
//ADC的时钟要低于36MHZ,具体见数据手册说明;
RCC->APB2ENR |= 1<<8;
ADC->CCR |= 3<<16; //4分频,那么ADC1的频率为21MHZ
// //第三步
// //设置ADC1的工作模式
// //见第五步
//
// //第四步
// //设置ADC1规则序列的相关信息
ADC1->SQR3 |= 0X6;
// //第五步
// //开启AD转化器 //在这里设置为连续转化模式;
//
ADC1->CR2 |= (1<<0);
ADC1->CR2 |= (1<<1);
ADC1->CR2 |= (1<30);
//其余没有设置的寄存器位,说明采用的是默认值,并不代表他们真的没有设置;
}[/mw_shl_code]
test.c
[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "led.h"
#include "usart.h"
#include "lcd.h"
#include "adc.h"
#include "beep.h"
/*
本实验的目的是:
采集电压值,并将其打印在串口上;
*/
/*
在ADC实验中,出现的问题是:
1.
在单次转化模式中,思考一下两个while的区别
2.
在单次转化模式中,ADC1->CR2 |= (1<30);必须放在主函数中,思考为什么?
难道我执行一次不行么?为何就没有数据输出?
3.
把单次转化模式和连续模式都编写一遍,予以总结;
4.
在ADC的连续转化模式中,是不是一个通道的其中某一个转化结束了,EOC就置1,
还是说一个通道的所有转化序列都结束才产生EOC置1?
5.
在连续转化模式中,它指的连续转化,是指一个通道的所有转化序列转化完一次就结束了,
还是一个通道的所有转化序列结束后,又重新开始转化?
*/
int main(void){
u32 temp;
u32 temp1;
u32 temp2;
Stm32_Clock_Init(336,8,2,7);//设置时钟,168MHZ
delay_init(168); //初始化延时函数
LED_Init();
uart_init(84-1,115200);
lcd_init();
ADC_Init();
while(1){
// //方式一:单次转化模式
// ADC1->CR2|=1<<30; //启动规则转换通道 //当转化完后,ADC停止工作,
// //此时,只需再次开启开始转化规则通道即可;
// while(!(ADC1->SR&1<<1));//等待转换结束
// //while(((ADC1->SR >> 1) & (0X1)) == 1); //while()这里有问题;
// temp = ADC1->DR;
// temp = temp; //平均值
// temp1 = temp*(3.3/4096); //浮点数的整数部分;
// temp2 = (temp*(3.3/4096) - temp1)*1000;
// printf("VCC:%d.%d
",temp1,temp2);
// delay_ms(1000);
//方式二:连续转化模式
while(!(ADC1->SR&(1<<1)));//等待转换结束
//while(((ADC1->SR >> 1) & (0X1)) == 1); //while()这里有问题;
temp = ADC1->DR;
temp1 = temp*(3.3/4096); //浮点数的整数部分;
temp2 = (temp*(3.3/4096) - temp1)*1000;
printf("VCC:%d.%d
",temp1,temp2);
delay_ms(1000);
}
}
[/mw_shl_code]
一周热门 更多>