滚印车间
您当前的位置:贴片加工 > 行业资讯

STM32仿真ADC

时间:2021-09-02 08:04:15  来源:  浏览量:
本帖最后由 追风逐月 于 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呢?
如图:


难道没有人提点建议?要把程序贴出来么?
我觉得去看别人的程序是一件很费神的事情,而且用函数写的程序一半不容易出问题,但是我之前的外部中断确实出了问题,跟着函数写的,但是却少了一个中断允许位没有设置,不知道别人的是怎么可以的,真是奇了怪
后面做了一个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);
         }
}
就这样了,参照原子的教程写的,程序执行到 判断转换是否完成 就不走了,从寄存器看根本没开始转换        ,所有就一直等                                                                        


Night1ngale 发表于 2017-8-10 23:11
最好把ADC初始化的那个代码或者贴出来,可以让大家分析分析,这样没有参考依据,没办法分析

软件仿真虽然能仿真到大部分功能,但是一些功能却是无法仿真到的,比如外部中断,因为没有外部信号输入,所以外部中断是无法仿真的。也比如从端口读入外部数据,比较典型的就是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
哇,库函数版的不是特别擅长。

貌似ADC的初始化有问题,1.没有设置两次采样之间的时间差;2.没有设置ADC的分频;3.没有设定ADC的外设使能。
  • [开关电源]VIPER22A设计电源心得本帖最后由xveqq123于2017-5-2910:26编辑
    最近用VIPER22A设计一电力猫电源。


    这是我绘制的原理图,初步设计20W,实际应用8W。


    仿真PCB图


    开气隙,用金刚石碗形砂轮。



  • 推荐资讯
    相关文章
    栏目更新
    栏目热门
    关于我们
    电脑周边
    家用电器
    通讯
    地区
    新闻中心
    深圳贴片加工厂
     
    • ☆电源板
    • ☆U盘
    • ☆网卡
    • ☆显卡
    • ☆监控摄像头
    • ☆电脑主板
    • ☆平板电脑主板
    • ☆DVD主板
    • 解码板
    • 伺服板
    • 高频头板
    • 复读机板
    • 音响主板
    • ☆手机主板
    • ☆手机按键板
    • ☆无线电话机
    • ☆对讲机主板
    • ☆深圳
    • 东莞
    • 广州
    • 龙岗
    • 宝安
    • 龙华
    • 坂田