本帖最后由 追风逐月 于 2017-8-8 14:38 编辑
今天用软件
仿真ADC,但是程序一直停在等待AD转换标志处while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));,采集通道IN0上已经加了一个正弦波,其它设置都没问题,软件触发也正常,但是转换数据寄存器一直是0,看寄存器状态显示是硬件开始转换标志STRT一直无变化,也就是说AD接收到软件触发后根本没有开始转换,所以转换完成标志位EOC也一直没有置位。但是为什么无法转换呢?硬件开始转换的标志位STRT为什么没有置位呢?难道用软件仿真还有什么区别于试验板的设置?我的程序是按照有试验板写的。
还有就是执行ADC_SoftwareStartConvCmd(ADC1, ENABLE);后,软件触发标志SWSTART和外部触发事件标志EXTTRIG都被置1,难道是EXTTRIG置1后要等到外部触发才能开始AD转换?但是明明我的函数是用软件触发啊,怎么EXTTRIG也会被置1呢?
如图:
void adc1_init(void) //ADC设置部分
{
ADC_InitTypeDef ADC_InitStructure;
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 转换由软件而不是外部 触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; // 顺序进行规则转换的ADC通道的数目为1
ADC_Init(ADC1, &ADC_InitStructure); // 初始化
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
int main(void) // 主函数部分
{
uint32_t ad;
uint8_t i;
serial_init(); //打印函数
usart_init1(); //串口初始化--为了打印
gpioa0_init(); //PA0设置作模拟输入,ADC1的0通道硬件引脚
adc1_init();
while(1)
{
for(i=0;i<50;i++) //处理50次转换数据
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发ADC1开始采集
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //判断转换是否完成
ad+=ADC_GetConversionValue(ADC1);
}
printf(" Vin: V %f us ",(3.3/4095)*ad/50);
}
}
就这样了,参照原子的教程写的,程序执行到 判断转换是否完成 就不走了,从寄存器看根本没开始转换 ,所有就一直等
贴上了,欢迎来指教
貌似ADC的初始化有问题,1.没有设置两次采样之间的时间差;2.没有设置ADC的分频;3.没有设定ADC的外设使能。
你参考的原子的代码没写全吧?
貌似ADC的初始化有问题,1.没有设置两次采样之间的时间差;2.没有设置ADC的分频;3.没有设定ADC的外设使能。
你参考的原子的代码没写全吧?
一周热门 更多>