Скоростная АРУ для ад603
Код:
[Выделить]/**
* реакция на выброс сигнала в пч 16000
*/
void AGC_analog_ini(void) {
tmp = (uint32_t) hdac1.Instance + DAC_DHR12R1_ALIGNMENT(0); // DAC address
}
void AGC_analog_reaction(void) {
raw_adc = hadc1.Instance->DR;// HAL_ADC_GetValue(&hadc1);
if (raw_adc > max_norm_ADC_VALUE) {
if ((int) (raw_adc - norm_ADC_VALUE) < 50)
dac_step = 1;
else dac_step = (raw_adc - norm_ADC_VALUE) >> 3;
if ((int) (dacValue - dac_step) >= 0) dacValue -= dac_step;
else dacValue = 0;
*(__IO uint32_t *) tmp = dacValue;// DAC
}
HAL_ADC_Start_my(&hadc1);//короткий вызов, просто очистка флагов
if (raw_adc > min_norm_ADC_VALUE) {
agc_delay_now = agc_delay;
}
if (raw_adc < min_norm_ADC_VALUE && !agc_delay_now) {
if (dacValue < 3000) dacValue++;
*(__IO uint32_t *) tmp = dacValue;// DAC
}
if (agc_delay_now > 0) agc_delay_now--;
}
int HAL_ADC_Start_my(ADC_HandleTypeDef *hadc) {
__HAL_LOCK(hadc);
/* Set ADC state */
/* - Clear state bitfield related to regular group conversion results */
/* - Set state bitfield related to regular operation */
ADC_STATE_CLR_SET(hadc->State,
HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR |
HAL_ADC_STATE_REG_EOSMP,
HAL_ADC_STATE_REG_BUSY);
ADC_CLEAR_ERRORCODE(hadc);
/* Clear ADC group regular conversion flag and overrun flag */
/* (To ensure of no unknown state from potential previous ADC operations) */
__HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
__HAL_UNLOCK(hadc);
/* Start ADC group regular conversion */
MODIFY_REG(hadc->Instance->CR,
ADC_CR_BITS_PROPERTY_RS,
ADC_CR_ADSTART);
//LL_ADC_REG_StartConversion(hadc->Instance);
return 0;
}