一,ADC
模拟信号
什么是模拟信号?主要是与离散的数字信号相对的连续的信号。模拟信号分布于自然界的各个角落,如每天温度的变化,
而数字信号是人为的抽象出来的在时间上不连续的信号。电学上的模拟信号是主要是指幅度和相位都连续的电信号,
此信号可以被模拟电路进行各种运算,如放大,相加,相乘等。模拟信号是指用连续变化的物理量表示的信息,
其信号的幅度,或频率,或相位随时间作连续变化,如目前广播的声音信号,或图像信号等 。常见的模拟信号有正弦波、 调幅波、 阻尼震荡波、 指数衰减波 。
数字信号
什么是数字信号?
数字信号指幅度的取值是离散的,幅值表示被限制在有限个数值之内。 二进制码就是一种数字信号。
二进制码受噪声的影响小,易于有数字电路进行处理,所以得到了广泛的应用
优点:
抗干扰能力强、无噪声积累
在模拟通信中,为了提高信噪比,需要在信号传输过程中及时对衰减的传输信号进行放大,信号在传输过程中不可避免地叠加上的噪声也被同时放大。
随着传输距离的增加,噪声累积越来越多,以致使传输质量严重恶化。
对于数字通信,由于数字信号的幅值为有限个离散值(通常取两个幅值),在传输过程中虽然也受到噪声的干扰,但当信噪比恶化到一定程度时,
即在适当的距离采用判决再生的方法,再生成没有噪声干扰的和原发送端一样的数字信号,所以可实现长距离高质量的传输。
便于加密处理
信息传输的安全性和保密性越来越重要,数字通信的加密处理的比模拟通信容易得多,以话音信号为例,经过数字变换后的信号可用简单的数字逻辑运算进行加密、解密处理。
便于存储、处理和交换
数字通信的信号形式和计算机所用信号一致,都是二进制代码,因此便于与计算机联网,也便于用计算机对数字信号进行存储、处理和交换,
可使通信网的管理、维护实现自动化、智能化。
设备便于集成化、微型
数字通信采用时分多路复用,不需要体积较大的滤波器。设备中大部分电路是数字电路,可用大规模和超大规模集成电路实现,因此体积小、功耗低。
便于构成综合数字网和综合业务数字网
采用数字传输方式,可以通过程控数字交换设备进行数字交换,以实现传输和交换的综合。
另外,电话业务和各种非话业务都可以实现数字化,构成综合业务数字网。
占用信道频带较宽
一路模拟电话的频带为4kHz带宽,一路数字电话约占64kHz,这是模拟通信目前仍有生命力的主要原因。
随着宽频带信道(光缆、数字微波)的大量利用(一对光缆可开通几千路电话)以及数字信号处理技术的发展(可将一路数字电话的数码率由64kb/s压缩到32kb/s甚至更低的数码率),
数字电话的带宽问题已不是主要问题了
常用的数字信号编码有不归零(NRZ)编码、 曼彻斯特(Manchester)编码和差分曼彻斯特(Differential Manchester)编码。
数字信号与模拟信号的转化
模拟信号和数字信号之间可以相互转换:模拟信号一般通过PCM脉码调制(Pulse Code Modulation)方法量化为数字信号,
即让模拟信号的不同幅度分别对应不同的二进制值,例如采用8位编码可将模拟信号量化为2^8=256个量级,实用中常采取24位或30位编码;
数字信号一般通过对载波进行移相(Phase Shift)的方法转换为模拟信号。计算机、计算机局域网与城域网中均使用二进制数字信号,
目前在计算机广域网中实际传送的则既有二进制数字信号,也有由数字信号转换而得的模拟信号。但是更具应用发展前景的是数字信号。
PCM脉码调制
脉冲编码调制就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输。
脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化, 编码的过程。
抽样: 就是对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号。
该模拟信号经过抽样后还应当包含原信号中所有信息,也就是说能无失真的恢复原模拟信号。
量化: 就是把经过抽样得到的瞬时值将其幅度离散,即用一组规定的电*,把瞬时抽样值用最接*的电*值来表示,通常是用二进制表示。
编码: 就是用一组二进制码组来表示每一个有固定电*的量化值。然而,实际上量化是在编码过程中同时完成的,故编码过程也称为模/数变换,可记作A/D。
STM32F4手册
如何知道当前是使用哪个ADC硬件,同时使用哪个通道?
PA5/ADC12_IN5,表示PA5引脚支持ADC1或ADC2进行扫描,使用通道是第五个输入通道
存储对齐方式
通过ADC硬件获取到的结果值,为什么还得要进行转换为电压值,依据是什么?
通过调整可调电阻实现灯光亮度的变化
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); }