求助!!!用stm32F103ZEADC单通道输入采集正弦波,发现采集到的图像发生重叠,请问是什么原因。

2019-10-11 15:56发布

#include "stm32f10x_lib.h"
#include "sys.h"
#include "delay.h"
void  adc_init(void) ;
void  USART_Initaize(u32 pclk2,u32 bound);
void  Uart1_PutChar(u8 ch);
void Uart1_PutString(u8 *Buf, u8 Len);
int find_phrase(float *a,float *b,u16 Ts);
u16 get_adc(void);
//主函数内容
int main(void)
{     
    u32 temp;
    u16 adcx;
    u8 table[4];
    u8 *p;
    p= table;
    Stm32_Clock_Init(9);//88M
    delay_init(72);     //延迟初始化
    USART_Initaize(72,9600); //设置波特率
    adc_init();
      while (1)
    {
            adcx=get_adc();
            temp=adcx*330/4096;
            adcx=temp;
            table[0]=adcx / 100 + 0x30;
            table[1]='.';
            table[2]=adcx % 100/10 + 0x30;
            table[3]= adcx %10 + 0x30;
            Uart1_PutString(p,4);
            Uart1_PutString(" ",2);
                                
    }  
         
}  
   
void  adc_init(void)
{     
    RCC->APB2ENR|=1<<2;    //使能PORTA口时钟
    GPIOA->CRL&=0XFFFFFFF0;//PA.0 anolog输入
    //&#205;¨&#181;&#192;10/11&#201;è&#214;&#195;   
    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 &#181;&#195;&#181;&#189;ADC&#178;&#201;&#209;ù&#194;&#202;&#206;&#187;43.65Khz   
    ADC1->CR1&=0XF0FFFF;   //工作模式清0
  ADC1->CR1|=0<<16;      //独立工作模式
  ADC1->CR1&=~(1<<8);    //非扫描方式
    ADC1->CR2&=~(1<<1);   //单次转换模式
    ADC1->CR2|=0x000E0000; //软件控制转换,由bit21控制
    ADC1->CR2|=1<<20;      //使用用外部触发(SWSTART),必须使用一个事件触发
    ADC1->CR2&=~(1<<11);   //右对齐

    ADC1->SQR1&=0xFFF0FFFF;//1个转换在规则序列中
    ADC1->SQR3&=0XFFFFFFE0;//规则序列1=通道0
    ADC1->SQR3|=0;  
  ADC1->SMPR2&=0XFFFFFFF8;//通道0采样时间清空
    ADC1->SMPR2|=0X07;     //通道0转换时间为:239.5+12.5个ADC时钟周期
    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); //等待校准结束
  ADC1->CR2&=~(1<<8); //不开启ADC DMA转换
    ADC1->CR2|=1<<0;    //开启AD转换
}

//获得ADC值
u16 get_adc(void)   
{      
    ADC1->CR2|=1<<22;       //启动规则转换通道
    while(!(ADC1->SR&1<<1));//等待转换结束   
    return ADC1->DR; //返回ADC值        
}

void  USART_Initaize(u32 pclk2,u32 bound)
{
    float temp;
    u16 mantissa;
    u16 fraction;      
    temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
    mantissa=temp;                 //得到整数部分
    fraction=(temp-mantissa)*16; //得到小数部分  
    mantissa<<=4;
    mantissa+=fraction;
    RCC->APB2ENR|=1<<2;   //使能PORTA口时钟
    RCC->APB2ENR|=1<<14;  //使能串口时钟
    GPIOA->CRH&=0XFFFFF00F;
    GPIOA->CRH|=0X000008B0;//IO状态设置
         
    RCC->APB2RSTR|=1<<14;   //复位串口
    RCC->APB2RSTR&=~(1<<14);//停止复位           
    //波特率设置
     USART1->BRR=mantissa; // 波特率设置  
    USART1->CR1|=0X200C;  //1位停止,无校检位
#ifdef EN_USART1_RX          //如果使能了接收
    //使能接收中断
    USART1->CR1|=1<<8;    //PE中断使能
    USART1->CR1|=1<<5;    //接收缓冲区非空中断使能         
    MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
#endif
}
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++);
    }
}









友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。