完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 追风逐月 于 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呢? 如图: |
|
相关推荐
10个回答
|
|
难道没有人提点建议?要把程序贴出来么?
我觉得去看别人的程序是一件很费神的事情,而且用函数写的程序一半不容易出问题,但是我之前的外部中断确实出了问题,跟着函数写的,但是却少了一个中断允许位没有设置,不知道别人的是怎么可以的,真是奇了怪 后面做了一个DAC的仿真是成功的,这个ADC先留着吧,等到有试验板了再试试 |
|
|
|
最好把ADC初始化的那个代码或者贴出来,可以让大家分析分析,这样没有参考依据,没办法分析
|
|
|
|
本帖最后由 追风逐月 于 2017-8-15 10:56 编辑
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("nVin: V %f usn",(3.3/4095)*ad/50); } } 就这样了,参照原子的教程写的,程序执行到 判断转换是否完成 就不走了,从寄存器看根本没开始转换 ,所有就一直等 |
|
|
|
贴上了,欢迎来指教 |
|
|
|
软件仿真虽然能仿真到大部分功能,但是一些功能却是无法仿真到的,比如外部中断,因为没有外部信号输入,所以外部中断是无法仿真的。也比如从端口读入外部数据,比较典型的就是LCD如1602,12864等读取LCD数据进行查忙判断时,因为没有外部数据输入,会变成死循环的。
ADC功能也有可能会是这种情况。 |
|
|
|
哇,库函数版的不是特别擅长。
貌似ADC的初始化有问题,1.没有设置两次采样之间的时间差;2.没有设置ADC的分频;3.没有设定ADC的外设使能。 你参考的原子的代码没写全吧? |
|
|
|
哇,库函数版的不是特别擅长。
貌似ADC的初始化有问题,1.没有设置两次采样之间的时间差;2.没有设置ADC的分频;3.没有设定ADC的外设使能。 你参考的原子的代码没写全吧? |
|
|
|
如果没人能帮到你的话,你告诉我STM32的型号,库函数的代码不是特别擅长,我得去帮你查查看。
|
|
|
|
如果没人能帮到你的话,你告诉我STM32的型号,库函数的代码不是特别擅长,我得去帮你查查看。
|
|
|
|
Night1ngale 发表于 2017-8-15 22:50 1、这个是采样周期239.5,ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); 2、这个是分频,12MHZ,RCC_ADCCLKConfig(RCC_PCLK2_Div6); 3、这是ADC1使能,ADC_Cmd(ADC1, ENABLE); 从仿真图的寄存器状态看是 硬件开始转换位 没正常值位,有板就可以知道是不是程序问题了。 我用的STM32F103VC 先前做外部中断的仿真也是这样,按库函数写好,最后怎么都进不去中断,后来还是少了一个中断允许没打开,但是原子的那个程序函数库里根本没有啊,还是我自己用寄存器直接加上去就好了。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
hal库中i2c卡死在HAL_I2C_Master_Transmit
1017 浏览 1 评论
LL库F030进行3个串口收发,2个串口为232,一个为485,长时间后,会出现串口1停止运行,另外两个正常,只有重启复原
1497 浏览 1 评论
525 浏览 0 评论
1059 浏览 0 评论
1228 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-5 14:22 , Processed in 0.997428 second(s), Total 89, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号