Возникли проблемы с работой АЦП на stm32f107vc - форма оцифрованного сигнала довольно сильно искажена - завалены фронты. см картинку:

На АЦП подается сигнал с генератора (звуковая карта) далее после оцифровки результат выдается на цап.
Входной и выходной сигнал выводятся также на осциллограф.
код мк:
CODE
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
int main(void)
{
/* Включаем порт А */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* Включаем ЦАП */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
AdcInit(); //выполнить инициализацию АЦП /
/* Настраиваем ногу PA4 и PA4 ЦАПа */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_4 | GPIO_Pin_5);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Включить DAC2 */
DAC->CR |= DAC_CR_BOFF2;
DAC->CR |= DAC_CR_EN2;
while(1)
{
short adc_val = ADC1->DR;
DAC->DHR12R2=(adc_val-2048);
}
}
void AdcInit(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Разрешить тактирование порта PORT A
//Конфигурирование PORT PA.3 - аналоговый вход
GPIOA->CRL &= ~GPIO_CRL_MODE3; //Очистить биты MODE
GPIOA->CRL &= ~GPIO_CRL_CNF3; //Очистить биты CNF
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //подаем тактирование АЦП
RCC->CFGR &= ~RCC_CFGR_ADCPRE; //входной делитель
ADC1->CR1 = 0; //
ADC1->SQR1 = 0; //
ADC1->CR2 |= ADC_CR2_CAL; //запуск калибровки
while (!(ADC1->CR2 & ADC_CR2_CAL)){}; //ждем окончания калибровки
ADC1->CR2 = ADC_CR2_EXTSEL; //выбрать источником запуска разряд SWSTART
ADC1->CR2 |= ADC_CR2_EXTTRIG; //разр. внешний запуск регулярного канала
ADC1->CR2 |= ADC_CR2_CONT; //режим непрерывного преобразования
/* Задаем длительность выборки */
ADC1->SMPR2 |= (ADC_SMPR2_SMP4_2 | ADC_SMPR2_SMP4_1 | ADC_SMPR2_SMP4_0);
ADC1->SQR3 = 3; //загрузить номер канала
ADC1->CR2 |= ADC_CR2_ADON; //включить АЦП
ADC1->CR2 |= ADC_CR2_SWSTART; //запустить процес преобразования
}
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
int main(void)
{
/* Включаем порт А */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* Включаем ЦАП */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
AdcInit(); //выполнить инициализацию АЦП /
/* Настраиваем ногу PA4 и PA4 ЦАПа */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_4 | GPIO_Pin_5);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Включить DAC2 */
DAC->CR |= DAC_CR_BOFF2;
DAC->CR |= DAC_CR_EN2;
while(1)
{
short adc_val = ADC1->DR;
DAC->DHR12R2=(adc_val-2048);
}
}
void AdcInit(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Разрешить тактирование порта PORT A
//Конфигурирование PORT PA.3 - аналоговый вход
GPIOA->CRL &= ~GPIO_CRL_MODE3; //Очистить биты MODE
GPIOA->CRL &= ~GPIO_CRL_CNF3; //Очистить биты CNF
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //подаем тактирование АЦП
RCC->CFGR &= ~RCC_CFGR_ADCPRE; //входной делитель
ADC1->CR1 = 0; //
ADC1->SQR1 = 0; //
ADC1->CR2 |= ADC_CR2_CAL; //запуск калибровки
while (!(ADC1->CR2 & ADC_CR2_CAL)){}; //ждем окончания калибровки
ADC1->CR2 = ADC_CR2_EXTSEL; //выбрать источником запуска разряд SWSTART
ADC1->CR2 |= ADC_CR2_EXTTRIG; //разр. внешний запуск регулярного канала
ADC1->CR2 |= ADC_CR2_CONT; //режим непрерывного преобразования
/* Задаем длительность выборки */
ADC1->SMPR2 |= (ADC_SMPR2_SMP4_2 | ADC_SMPR2_SMP4_1 | ADC_SMPR2_SMP4_0);
ADC1->SQR3 = 3; //загрузить номер канала
ADC1->CR2 |= ADC_CR2_ADON; //включить АЦП
ADC1->CR2 |= ADC_CR2_SWSTART; //запустить процес преобразования
}