#define Sample_Num 10
vu16 ADC_ConvertedValue[Sample_Num][Channel_Num]
void ADC_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE)
DMA_DeInit(DMA1_Channel1)
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC
DMA_InitStructure.DMA_BufferSize = Sample_Num*Channel_Num
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable//外设地址不羡枝伍变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable//内存地址递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular
DMA_InitStructure.DMA_Priority = DMA_Priority_High
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable
DMA_Init(DMA1_Channel1, &DMA_InitStructure)
DMA_Cmd(DMA1_Channel1,ENABLE)
}
void ADC1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure
ADC_InitTypeDef ADC_InitStructure
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN
GPIO_Init(GPIOA, &GPIO_InitStructure)
ADC_DMA_Config()
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE)
// ADC_DeInit(ADC1)
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent//搭悔ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE//多通道
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE//连续转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None//软件启动转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right//转换结果右对齐
ADC_InitStructure.ADC_NbrOfChannel = Channel_Num//通道数目
ADC_Init(ADC1, &ADC_InitStructure)
// ADC_TempSensorVrefintCmd(ENABLE)//使能片内温度传感器兄或
RCC_ADCCLKConfig(RCC_PCLK2_Div6) //PCLK 6分频
//通道,转换次序,转换时间
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5)
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_55Cycles5)
ADC_DMACmd(ADC1, ENABLE)
ADC_Cmd(ADC1, ENABLE)
ADC_ResetCalibration(ADC1)
while(ADC_GetResetCalibrationStatus(ADC1))
ADC_StartCalibration(ADC1)//开始校准
while(ADC_GetCalibrationStatus(ADC1))
ADC_SoftwareStartConvCmd(ADC1, ENABLE)//使能ADC的软件转换启动功能
}
uint16_t ReadADCAverageValue(uint16_t Channel)
{
uint8_t i
uint32_t sum = 0
for(i=0i<Sample_Numi++)
{
sum+=ADC_ConvertedValue[i][Channel]
}
return (sum/Sample_Num)
}
ADC的作用是将模拟量转换为数字量,用于采集模拟信号,同时转换为单片机识别的数值(因为任何计野桥搜算机都只认0,1以及他们的组合)DAC正好相反,将数字转换为模拟信号。你明白ADC和DAC 的作用,至于他为什么是双DAC、ADC这个只是配置的问题,就好像汽车手动挡和自动挡这样。因为用于测量模拟的话,可能你只用1路,那他足够了,如果你同时测量2路,那么正好,DAC也是你可以只用1路,甚至不用,也可以同时用2路,在多也只能拿TIM的PWM模式来模拟消漏了。不过他这么2路ADC和2路DAC我想用来做数字音频应该也是颂历可以的。因为ADC采样速度是1MHZ。。采集48KHZ的音频信号频率足够了。
当然还要配上你的程序
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)