一,ADC

模拟信号

什么是模拟信号?主要是离散的数字信号相对的连续的信号。模拟信号分布于自然界的各个角落,如每天温度的变化,

数字信号是人为的抽象出来的在时间上不连续的信号。电学上的模拟信号是主要是指幅度和相位都连续的电信号,

此信号可以被模拟电路进行各种运算,如放大,相加,相乘等。模拟信号是指用连续变化的物理量表示的信息

其信号的幅度,或频率,或相位随时间作连续变化,如目前广播的声音信号,或图像信号等 。常见的模拟信号有正弦波、 调幅波、 阻尼震荡波、 指数衰减波

ADC-DAC

 

                      ADC-DAC

 

数字信号

什么是数字信号?

数字信号指幅度的取值是离散的,幅值表示被限制在有限个数值之内。 二进制码就是一种数字信号

二进制码受噪声的影响小,易于有数字电路进行处理,所以得到了广泛的应用

              ADC-DAC

优点:

抗干扰能力强、无噪声积累

在模拟通信中,为了提高信噪比,需要在信号传输过程中及时对衰减的传输信号进行放大信号在传输过程中不可避免地叠加上的噪声也被同时放大

随着传输距离的增加,噪声累积越来越多,以致使传输质量严重恶化。

对于数字通信,由于数字信号的幅值为有限个离散值(通常取两个幅值),在传输过程中虽然也受到噪声的干扰,但当信噪比恶化到一定程度时,

即在适当的距离采用判决再生的方法,再生成没有噪声干扰的和原发送端一样的数字信号,所以可实现长距离高质量的传输。

便于加密处理

信息传输的安全性和保密性越来越重要,数字通信的加密处理的比模拟通信容易得多,以话音信号为例,经过数字变换后的信号可用简单的数字逻辑运算进行加密、解密处理。

便于存储、处理和交换

数字通信的信号形式和计算机所用信号一致,都是二进制代码,因此便于与计算机联网,也便于用计算机对数字信号进行存储、处理和交换,

可使通信网的管理、维护实现自动化、智能化。

设备便于集成化、微型

数字通信采用时分多路复用,不需要体积较大的滤波器。设备中大部分电路是数字电路,可用大规模和超大规模集成电路实现,因此体积小、功耗低。

便于构成综合数字网和综合业务数字网

采用数字传输方式,可以通过程控数字交换设备进行数字交换,以实现传输和交换的综合。

另外,电话业务和各种非话业务都可以实现数字化,构成综合业务数字网。

占用信道频带较宽

一路模拟电话的频带为4kHz带宽,一路数字电话约占64kHz,这是模拟通信目前仍有生命力的主要原因。

随着宽频带信道(光缆、数字微波)的大量利用(一对光缆可开通几千路电话)以及数字信号处理技术的发展(可将一路数字电话的数码率由64kb/s压缩到32kb/s甚至更低的数码率),

数字电话的带宽问题已不是主要问题了

 

常用的数字信号编码有不归零(NRZ)编码、 曼彻斯特(Manchester)编码和差分曼彻斯特(Differential Manchester)编码。

                ADC-DAC

 

数字信号与模拟信号的转化

模拟信号和数字信号之间可以相互转换:模拟信号一般通过PCM脉码调制(Pulse Code Modulation)方法量化为数字信号

即让模拟信号的不同幅度分别对应不同的二进制值,例如采用8位编码可将模拟信号量化为2^8=256个量级,实用中常采取24位或30位编码;

数字信号一般通过对载波进行移相(Phase Shift)的方法转换为模拟信号。计算机、计算机局域网与城域网中均使用二进制数字信号,

目前在计算机广域网中实际传送的则既有二进制数字信号,也有由数字信号转换而得的模拟信号。但是更具应用发展前景的是数字信号。

 

PCM脉码调制

脉冲编码调制就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输。

脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化, 编码的过程

ADC-DAC

 

抽样: 就是对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号。

该模拟信号经过抽样后还应当包含原信号中所有信息,也就是说能无失真的恢复原模拟信号。

量化: 就是把经过抽样得到的瞬时值将其幅度离散,即用一组规定的电*,把瞬时抽样值用最接*的电*值来表示,通常是用二进制表示。

编码: 就是用一组二进制码组来表示每一个有固定电*的量化值。然而,实际上量化是在编码过程中同时完成的,故编码过程也称为模/数变换,可记作A/D。

 

STM32F4手册

 

ADC-DAC

 

如何知道当前是使用哪个ADC硬件,同时使用哪个通道?

PA5/ADC12_IN5,表示PA5引脚支持ADC1或ADC2进行扫描,使用通道是第五个输入通道

存储对齐方式

ADC-DAC

 

通过ADC硬件获取到的结果值,为什么还得要进行转换为电压值,依据是什么?

ADC-DAC

 

通过调整可调电阻实现灯光亮度的变化

ADC-DAC

 

int main(void)
{
    uint32_t adc_val,adc_vol,pwm_cmp=0;;

    //系统时钟的时钟源=168MHz/8=21MHz
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

    //串口初始化,波特率为115200bps
    usart1_init(115200);

    //adc初始化,12位精度
    adc_init();

    //定时器14初始化为PWM,使用PWM通道1,当前频率为100Hz
    tim14_init();

    while(1)
    {
        /* Start ADC Software Conversion ,启动ADC*/ 
        ADC_SoftwareStartConv(ADC1);    

        //等待转换结束
        while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);

        //获取ADC转换后的数值
        adc_val=ADC_GetConversionValue(ADC1);

        //将ADC的数值转换为电压值
        adc_vol = adc_val *3300/4095;


        printf("vol=%dmv\r\n",adc_vol);

        //设置比较值
        pwm_cmp = adc_vol*100/3300 ;

        TIM_SetCompare1(TIM14,pwm_cmp);

        printf("pwm compare=%d\r\n",pwm_cmp);

        delay_ms(500);
        
    }
}

 

void tim14_init(void)
{
    /* GPIOF clock enable */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

    /* GPIOF Configuration: TIM14 CH1 (PF9) */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;            //复用功能,使用引脚的第二功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
    GPIO_Init(GPIOF, &GPIO_InitStructure); 

    /* Connect TIM pins to AF9 */
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);

    /* TIM14 clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);


    /* Time base configuration,100Hz*/
    TIM_TimeBaseStructure.TIM_Period = (10000/100)-1;                    //定时计数值,100Hz
    TIM_TimeBaseStructure.TIM_Prescaler = 8400;                            //预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                //再次进行1分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;            //向上计数
    TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);


    /* PWM1 Mode configuration: Channel1 */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM14, &TIM_OCInitStructure);


    TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);                    //自动重载初值,不断输出PWM脉冲
    TIM_ARRPreloadConfig(TIM14, ENABLE);                                //自动重载使能                        

    /* TIM14 enable counter */
    TIM_Cmd(TIM14, ENABLE);

}
tim14_init

相关文章: