Move some pins around, use LED3, and name the AUDIO_IN pin. Initialize DAC, Op Amp and ADC in main(). Increase ADC clock to 80MHz and enable 16x oversampling. Increase sample time to 6.5 cycles. Support up to 16-bit ADC values (oversampling). Widen the DFT bins used for twist detection. Increase the amount of error checking we do. Improve input gain setting algorithm.

m17
Rob Riggs 2018-08-05 19:21:52 -05:00
rodzic 660ebffb73
commit 5b2b150b0d
12 zmienionych plików z 268 dodań i 192 usunięć

Wyświetl plik

@ -61,12 +61,12 @@
#define VCP_TX_Pin GPIO_PIN_2
#define VCP_TX_GPIO_Port GPIOA
#define AUDIO_IN_Pin GPIO_PIN_3
#define AUDIO_IN_GPIO_Port GPIOA
#define AUDIO_OUT_DAC_Pin GPIO_PIN_4
#define AUDIO_OUT_DAC_GPIO_Port GPIOA
#define AUDIO_IN_VREF_Pin GPIO_PIN_5
#define AUDIO_IN_VREF_GPIO_Port GPIOA
#define AUDIO_OUT_ATTEN_Pin GPIO_PIN_0
#define AUDIO_OUT_ATTEN_GPIO_Port GPIOB
#define BUTTON_AUDIO_IN_ADJUST_Pin GPIO_PIN_1
#define BUTTON_AUDIO_IN_ADJUST_GPIO_Port GPIOB
#define BUTTON_AUDIO_IN_ADJUST_EXTI_IRQn EXTI1_IRQn
@ -88,6 +88,8 @@
#define VCP_RX_GPIO_Port GPIOA
#define LD3_Pin GPIO_PIN_3
#define LD3_GPIO_Port GPIOB
#define AUDIO_OUT_ATTEN_Pin GPIO_PIN_5
#define AUDIO_OUT_ATTEN_GPIO_Port GPIOB
/* ########################## Assert Selection ############################## */
/**

Wyświetl plik

@ -13,17 +13,21 @@ ADC1.EnableInjectedConversion=DISABLE
ADC1.EnableRegularConversion=ENABLE
ADC1.ExternalTrigConv=ADC_EXTERNALTRIG_T6_TRGO
ADC1.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_RISING
ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,NbrOfConversionFlag,master,DMAContinuousRequests,Overrun,ExternalTrigConv,OversamplingMode,ClockPrescaler,Resolution,DataAlign,ScanConvMode,ContinuousConvMode,DiscontinuousConvMode,EOCSelection,LowPowerAutoWait,EnableRegularConversion,NbrOfConversion,ExternalTrigConvEdge,EnableInjectedConversion,EnableAnalogWatchDog1,EnableAnalogWatchDog2,EnableAnalogWatchDog3
ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,NbrOfConversionFlag,DMAContinuousRequests,Overrun,ExternalTrigConv,OversamplingMode,ClockPrescaler,Resolution,DataAlign,ScanConvMode,ContinuousConvMode,DiscontinuousConvMode,EOCSelection,LowPowerAutoWait,EnableRegularConversion,NbrOfConversion,ExternalTrigConvEdge,EnableInjectedConversion,EnableAnalogWatchDog1,EnableAnalogWatchDog2,EnableAnalogWatchDog3,RightBitShift,Ratio,OversamplingStopReset,TriggeredMode,master
ADC1.LowPowerAutoWait=DISABLE
ADC1.NbrOfConversion=1
ADC1.NbrOfConversionFlag=1
ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE
ADC1.Overrun=ADC_OVR_DATA_OVERWRITTEN
ADC1.OversamplingMode=DISABLE
ADC1.OversamplingMode=ENABLE
ADC1.OversamplingStopReset=ADC_REGOVERSAMPLING_CONTINUED_MODE
ADC1.Rank-0\#ChannelRegularConversion=1
ADC1.Ratio=ADC_OVERSAMPLING_RATIO_16
ADC1.Resolution=ADC_RESOLUTION_12B
ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5
ADC1.RightBitShift=ADC_RIGHTBITSHIFT_2
ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_6CYCLES_5
ADC1.ScanConvMode=ADC_SCAN_DISABLE
ADC1.TriggeredMode=ADC_TRIGGEREDMODE_SINGLE_TRIGGER
ADC1.master=1
CRC.CRCLength=CRC_POLYLENGTH_16B
CRC.DefaultInitValueUse=DEFAULT_INIT_VALUE_DISABLE
@ -35,76 +39,77 @@ CRC.InputDataInversionMode=CRC_INPUTDATA_INVERSION_BYTE
DAC1.DAC_Channel-DAC_OUT2=DAC_CHANNEL_2
DAC1.DAC_Trigger-DAC_OUT1=DAC_TRIGGER_T7_TRGO
DAC1.IPParameters=DAC_Channel-DAC_OUT2,DAC_Trigger-DAC_OUT1
Dma.ADC1.0.Direction=DMA_PERIPH_TO_MEMORY
Dma.ADC1.0.Instance=DMA1_Channel1
Dma.ADC1.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.ADC1.0.MemInc=DMA_MINC_ENABLE
Dma.ADC1.0.Mode=DMA_CIRCULAR
Dma.ADC1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.ADC1.0.PeriphInc=DMA_PINC_DISABLE
Dma.ADC1.0.Priority=DMA_PRIORITY_LOW
Dma.ADC1.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.DAC_CH1.3.Direction=DMA_MEMORY_TO_PERIPH
Dma.DAC_CH1.3.Instance=DMA2_Channel4
Dma.DAC_CH1.3.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.DAC_CH1.3.MemInc=DMA_MINC_ENABLE
Dma.DAC_CH1.3.Mode=DMA_CIRCULAR
Dma.DAC_CH1.3.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.DAC_CH1.3.PeriphInc=DMA_PINC_DISABLE
Dma.DAC_CH1.3.Priority=DMA_PRIORITY_LOW
Dma.DAC_CH1.3.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.I2C3_RX.4.Direction=DMA_PERIPH_TO_MEMORY
Dma.I2C3_RX.4.Instance=DMA1_Channel3
Dma.I2C3_RX.4.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.I2C3_RX.4.MemInc=DMA_MINC_ENABLE
Dma.I2C3_RX.4.Mode=DMA_NORMAL
Dma.I2C3_RX.4.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.I2C3_RX.4.PeriphInc=DMA_PINC_DISABLE
Dma.I2C3_RX.4.Priority=DMA_PRIORITY_LOW
Dma.I2C3_RX.4.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.I2C3_TX.5.Direction=DMA_MEMORY_TO_PERIPH
Dma.I2C3_TX.5.Instance=DMA1_Channel2
Dma.I2C3_TX.5.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.I2C3_TX.5.MemInc=DMA_MINC_ENABLE
Dma.I2C3_TX.5.Mode=DMA_NORMAL
Dma.I2C3_TX.5.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.I2C3_TX.5.PeriphInc=DMA_PINC_DISABLE
Dma.I2C3_TX.5.Priority=DMA_PRIORITY_LOW
Dma.I2C3_TX.5.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.Request0=ADC1
Dma.Request1=USART2_RX
Dma.Request2=USART2_TX
Dma.Request3=DAC_CH1
Dma.Request4=I2C3_RX
Dma.Request5=I2C3_TX
Dma.ADC1.5.Direction=DMA_PERIPH_TO_MEMORY
Dma.ADC1.5.Instance=DMA1_Channel1
Dma.ADC1.5.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.ADC1.5.MemInc=DMA_MINC_ENABLE
Dma.ADC1.5.Mode=DMA_CIRCULAR
Dma.ADC1.5.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.ADC1.5.PeriphInc=DMA_PINC_DISABLE
Dma.ADC1.5.Priority=DMA_PRIORITY_LOW
Dma.ADC1.5.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.DAC_CH1.2.Direction=DMA_MEMORY_TO_PERIPH
Dma.DAC_CH1.2.Instance=DMA2_Channel4
Dma.DAC_CH1.2.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.DAC_CH1.2.MemInc=DMA_MINC_ENABLE
Dma.DAC_CH1.2.Mode=DMA_CIRCULAR
Dma.DAC_CH1.2.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.DAC_CH1.2.PeriphInc=DMA_PINC_DISABLE
Dma.DAC_CH1.2.Priority=DMA_PRIORITY_LOW
Dma.DAC_CH1.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.I2C3_RX.3.Direction=DMA_PERIPH_TO_MEMORY
Dma.I2C3_RX.3.Instance=DMA1_Channel3
Dma.I2C3_RX.3.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.I2C3_RX.3.MemInc=DMA_MINC_ENABLE
Dma.I2C3_RX.3.Mode=DMA_NORMAL
Dma.I2C3_RX.3.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.I2C3_RX.3.PeriphInc=DMA_PINC_DISABLE
Dma.I2C3_RX.3.Priority=DMA_PRIORITY_LOW
Dma.I2C3_RX.3.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.I2C3_TX.4.Direction=DMA_MEMORY_TO_PERIPH
Dma.I2C3_TX.4.Instance=DMA1_Channel2
Dma.I2C3_TX.4.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.I2C3_TX.4.MemInc=DMA_MINC_ENABLE
Dma.I2C3_TX.4.Mode=DMA_NORMAL
Dma.I2C3_TX.4.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.I2C3_TX.4.PeriphInc=DMA_PINC_DISABLE
Dma.I2C3_TX.4.Priority=DMA_PRIORITY_LOW
Dma.I2C3_TX.4.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.Request0=USART2_RX
Dma.Request1=USART2_TX
Dma.Request2=DAC_CH1
Dma.Request3=I2C3_RX
Dma.Request4=I2C3_TX
Dma.Request5=ADC1
Dma.RequestsNb=6
Dma.USART2_RX.1.Direction=DMA_PERIPH_TO_MEMORY
Dma.USART2_RX.1.Instance=DMA1_Channel6
Dma.USART2_RX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART2_RX.1.MemInc=DMA_MINC_ENABLE
Dma.USART2_RX.1.Mode=DMA_NORMAL
Dma.USART2_RX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART2_RX.1.PeriphInc=DMA_PINC_DISABLE
Dma.USART2_RX.1.Priority=DMA_PRIORITY_LOW
Dma.USART2_RX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.USART2_TX.2.Direction=DMA_MEMORY_TO_PERIPH
Dma.USART2_TX.2.Instance=DMA1_Channel7
Dma.USART2_TX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART2_TX.2.MemInc=DMA_MINC_ENABLE
Dma.USART2_TX.2.Mode=DMA_NORMAL
Dma.USART2_TX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART2_TX.2.PeriphInc=DMA_PINC_DISABLE
Dma.USART2_TX.2.Priority=DMA_PRIORITY_LOW
Dma.USART2_TX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.USART2_RX.0.Direction=DMA_PERIPH_TO_MEMORY
Dma.USART2_RX.0.Instance=DMA1_Channel6
Dma.USART2_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART2_RX.0.MemInc=DMA_MINC_ENABLE
Dma.USART2_RX.0.Mode=DMA_NORMAL
Dma.USART2_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART2_RX.0.PeriphInc=DMA_PINC_DISABLE
Dma.USART2_RX.0.Priority=DMA_PRIORITY_LOW
Dma.USART2_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.USART2_TX.1.Direction=DMA_MEMORY_TO_PERIPH
Dma.USART2_TX.1.Instance=DMA1_Channel7
Dma.USART2_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART2_TX.1.MemInc=DMA_MINC_ENABLE
Dma.USART2_TX.1.Mode=DMA_NORMAL
Dma.USART2_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART2_TX.1.PeriphInc=DMA_PINC_DISABLE
Dma.USART2_TX.1.Priority=DMA_PRIORITY_LOW
Dma.USART2_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
FREERTOS.FootprintOK=true
FREERTOS.HEAP_NUMBER=4
FREERTOS.IPParameters=Tasks01,FootprintOK,configUSE_TICKLESS_IDLE,MEMORY_ALLOCATION,configTOTAL_HEAP_SIZE,HEAP_NUMBER,configUSE_TIMERS,Queues01,Timers01
FREERTOS.IPParameters=Tasks01,FootprintOK,configUSE_TICKLESS_IDLE,MEMORY_ALLOCATION,configTOTAL_HEAP_SIZE,HEAP_NUMBER,configUSE_TIMERS,Queues01,Timers01,configCHECK_FOR_STACK_OVERFLOW
FREERTOS.MEMORY_ALLOCATION=2
FREERTOS.Queues01=ioEventQueue,16,uint32_t,0,Static,ioEventQueueBuffer,ioEventQueueControlBlock;serialInputQueue,16,uint32_t,0,Static,serialInputQueueBuffer,serialInputQueueControlBlock;serialOutputQueue,16,uint32_t,0,Static,serialOutputQueueBuffer,serialOutputQueueControlBlock;audioInputQueue,4,uint8_t,0,Static,audioInputQueueBuffer,audioInputQueueControlBlock;hdlcInputQueue,3,uint32_t,0,Static,hdlcInputQueueBuffer,hdlcInputQueueControlBlock;hdlcOutputQueue,3,uint32_t,0,Static,hdlcOutputQueueBuffer,hdlcOutputQueueControlBlock;dacOutputQueue,128,uint8_t,0,Static,dacOutputQueueBuffer,dacOutputQueueControlBlock;adcInputQueue,3,uint32_t,0,Static,adcInputQueueBuffer,adcInputQueueControlBlock
FREERTOS.Tasks01=defaultTask,-3,256,startDefaultTask,Default,NULL,Static,defaultTaskBuffer,defaultTaskControlBlock;ioEventTask,-2,384,startIOEventTask,As external,NULL,Static,ioEventTaskBuffer,ioEventTaskControlBlock;audioInputTask,0,512,startAudioInputTask,As external,NULL,Static,audioInputTaskBuffer,audioInputTaskControlBlock;modulatorTask,0,384,startModulatorTask,As external,NULL,Static,modulatorTaskBuffer,modulatorTaskControlBlock
FREERTOS.Timers01=beaconTimer1,onBeaconTimer1,osTimerPeriodic,As external,NULL,Dynamic,NULL;beaconTimer2,onBeaconTimer2,osTimerPeriodic,As external,NULL,Dynamic,NULL;beaconTimer3,onBeaconTimer3,osTimerPeriodic,As external,NULL,Dynamic,NULL;beaconTimer4,onBeaconTimer4,osTimerPeriodic,As external,NULL,Dynamic,NULL
FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2
FREERTOS.configTOTAL_HEAP_SIZE=4096
FREERTOS.configUSE_TICKLESS_IDLE=0
FREERTOS.configUSE_TICKLESS_IDLE=1
FREERTOS.configUSE_TIMERS=1
File.Version=6
I2C3.I2C_Speed_Mode=I2C_Fast_Plus
@ -131,18 +136,18 @@ Mcu.Name=STM32L432K(B-C)Ux
Mcu.Package=UFQFPN32
Mcu.Pin0=PC14-OSC32_IN (PC14)
Mcu.Pin1=PC15-OSC32_OUT (PC15)
Mcu.Pin10=PB1
Mcu.Pin11=PA8
Mcu.Pin12=PA9
Mcu.Pin13=PA10
Mcu.Pin14=PA11
Mcu.Pin15=PA12
Mcu.Pin16=PA13 (JTMS-SWDIO)
Mcu.Pin17=PA14 (JTCK-SWCLK)
Mcu.Pin18=PA15 (JTDI)
Mcu.Pin19=PB3 (JTDO-TRACESWO)
Mcu.Pin10=PA8
Mcu.Pin11=PA9
Mcu.Pin12=PA10
Mcu.Pin13=PA11
Mcu.Pin14=PA12
Mcu.Pin15=PA13 (JTMS-SWDIO)
Mcu.Pin16=PA14 (JTCK-SWCLK)
Mcu.Pin17=PA15 (JTDI)
Mcu.Pin18=PB3 (JTDO-TRACESWO)
Mcu.Pin19=PB4 (NJTRST)
Mcu.Pin2=PA0
Mcu.Pin20=PB4 (NJTRST)
Mcu.Pin20=PB5
Mcu.Pin21=PB6
Mcu.Pin22=PB7
Mcu.Pin23=VP_ADC1_OPAMP1_OUT
@ -159,13 +164,13 @@ Mcu.Pin5=PA3
Mcu.Pin6=PA4
Mcu.Pin7=PA5
Mcu.Pin8=PA7
Mcu.Pin9=PB0
Mcu.Pin9=PB1
Mcu.PinsNb=31
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32L432KCUx
MxCube.Version=4.26.0
MxDb.Version=DB.4.0.260
MxCube.Version=4.26.1
MxDb.Version=DB.4.0.261
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:false\:false\:false
NVIC.DMA1_Channel1_IRQn=true\:5\:0\:false\:false\:true\:true\:false
NVIC.DMA1_Channel2_IRQn=true\:5\:0\:false\:false\:true\:true\:false
@ -229,9 +234,10 @@ PA2.GPIO_Label=VCP_TX
PA2.Locked=true
PA2.Mode=Asynchronous
PA2.Signal=USART2_TX
PA3.GPIOParameters=GPIO_Label
PA3.GPIO_Label=AUDIO_IN
PA3.Locked=true
PA3.Mode=PGA Connected
PA3.Signal=OPAMP1_VOUT
PA3.Signal=SharedAnalog_PA3
PA4.GPIOParameters=GPIO_Label
PA4.GPIO_Label=AUDIO_OUT_DAC
PA4.Locked=true
@ -242,6 +248,7 @@ PA5.Locked=true
PA5.Signal=COMP_DAC12_group
PA7.GPIOParameters=GPIO_PuPdOD
PA7.GPIO_PuPdOD=GPIO_NOPULL
PA7.Locked=true
PA7.Mode=I2C
PA7.Signal=I2C3_SCL
PA8.GPIOParameters=PinState,GPIO_Label,GPIO_ModeDefaultOutputPP
@ -256,11 +263,6 @@ PA9.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD
PA9.Locked=true
PA9.PinState=GPIO_PIN_SET
PA9.Signal=GPIO_Output
PB0.GPIOParameters=GPIO_Label,GPIO_ModeDefaultOutputPP
PB0.GPIO_Label=AUDIO_OUT_ATTEN
PB0.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD
PB0.Locked=true
PB0.Signal=GPIO_Output
PB1.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI
PB1.GPIO_Label=BUTTON_AUDIO_IN_ADJUST
PB1.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING
@ -274,8 +276,15 @@ PB3\ (JTDO-TRACESWO).Signal=GPIO_Output
PB3\ (JTDO-TRACESWO).Stacked=true
PB4\ (NJTRST).GPIOParameters=GPIO_PuPdOD
PB4\ (NJTRST).GPIO_PuPdOD=GPIO_NOPULL
PB4\ (NJTRST).Locked=true
PB4\ (NJTRST).Mode=I2C
PB4\ (NJTRST).Signal=I2C3_SDA
PB5.GPIOParameters=PinState,GPIO_Label,GPIO_ModeDefaultOutputPP
PB5.GPIO_Label=AUDIO_OUT_ATTEN
PB5.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD
PB5.Locked=true
PB5.PinState=GPIO_PIN_SET
PB5.Signal=GPIO_Output
PB6.Locked=true
PB6.Signal=GPIO_Analog
PB7.Locked=true
@ -322,7 +331,7 @@ ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=true
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-MX_DMA_Init-DMA-false-HAL-true,3-SystemClock_Config-RCC-false-HAL-false,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_CRC_Init-CRC-false-HAL-true,6-MX_DAC1_Init-DAC1-false-HAL-true,7-MX_OPAMP1_Init-OPAMP1-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_TIM6_Init-TIM6-false-HAL-true,10-MX_TIM7_Init-TIM7-false-HAL-true,11-MX_USART2_UART_Init-USART2-false-HAL-true,12-MX_I2C3_Init-I2C3-false-HAL-true
RCC.48CLKFreq_Value=24000000
RCC.ADCFreq_Value=48000000
RCC.ADCFreq_Value=80000000
RCC.AHBFreq_Value=48000000
RCC.APB1Freq_Value=48000000
RCC.APB1TimFreq_Value=48000000
@ -357,17 +366,17 @@ RCC.PLLN=24
RCC.PLLPoutputFreq_Value=13714285.714285715
RCC.PLLQoutputFreq_Value=48000000
RCC.PLLRCLKFreq_Value=48000000
RCC.PLLSAI1N=24
RCC.PLLSAI1PoutputFreq_Value=13714285.714285715
RCC.PLLSAI1QoutputFreq_Value=48000000
RCC.PLLSAI1RoutputFreq_Value=48000000
RCC.PLLSAI1N=40
RCC.PLLSAI1PoutputFreq_Value=22857142.85714286
RCC.PLLSAI1QoutputFreq_Value=80000000
RCC.PLLSAI1RoutputFreq_Value=80000000
RCC.PREFETCH_ENABLE=1
RCC.PWRFreq_Value=48000000
RCC.RNGFreq_Value=48000000
RCC.RNGFreq_Value=80000000
RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE
RCC.RTCFreq_Value=32768
RCC.RTCHSEDivFreq_Value=4000000
RCC.SAI1Freq_Value=13714285.714285715
RCC.SAI1Freq_Value=22857142.85714286
RCC.SWPMI1Freq_Value=48000000
RCC.SYSCLKFreq_VALUE=48000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
@ -376,10 +385,10 @@ RCC.TimerFreq_Value=32000000
RCC.USART1Freq_Value=48000000
RCC.USART2Freq_Value=48000000
RCC.USART3Freq_Value=16000000
RCC.USBFreq_Value=48000000
RCC.USBFreq_Value=80000000
RCC.VCOInputFreq_Value=4000000
RCC.VCOOutputFreq_Value=96000000
RCC.VCOSAI1OutputFreq_Value=96000000
RCC.VCOSAI1OutputFreq_Value=160000000
RCC.WatchDogFreq_Value=32000
SH.COMP_DAC11_group.0=DAC1_OUT1,DAC_OUT1
SH.COMP_DAC11_group.ConfNb=1
@ -387,6 +396,9 @@ SH.COMP_DAC12_group.0=DAC1_OUT2,DAC_OUT2
SH.COMP_DAC12_group.ConfNb=1
SH.GPXTI1.0=GPIO_EXTI1
SH.GPXTI1.ConfNb=1
SH.SharedAnalog_PA3.0=ADC1_IN8
SH.SharedAnalog_PA3.1=OPAMP1_VOUT,PGA Connected
SH.SharedAnalog_PA3.ConfNb=2
TIM6.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE
TIM6.IPParameters=Period,AutoReloadPreload,TIM_MasterOutputTrigger
TIM6.Period=1817

Wyświetl plik

@ -284,9 +284,11 @@ int main(void)
/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
HAL_DAC_Start(&hdac1, DAC_CHANNEL_2);
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, 1024);
HAL_OPAMP_Start(&hopamp1);
if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, 1024) != HAL_OK) Error_Handler();
if (HAL_DAC_Start(&hdac1, DAC_CHANNEL_2) != HAL_OK) Error_Handler();
if (HAL_OPAMP_SelfCalibrate(&hopamp1) != HAL_OK) Error_Handler();
if (HAL_OPAMP_Start(&hopamp1) != HAL_OK) Error_Handler();
if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) != HAL_OK) Error_Handler();
/* USER CODE END RTOS_QUEUES */
@ -367,7 +369,7 @@ void SystemClock_Config(void)
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_MSI;
PeriphClkInit.PLLSAI1.PLLSAI1M = 1;
PeriphClkInit.PLLSAI1.PLLSAI1N = 24;
PeriphClkInit.PLLSAI1.PLLSAI1N = 40;
PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7;
PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2;
PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2;
@ -423,7 +425,11 @@ static void MX_ADC1_Init(void)
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
hadc1.Init.DMAContinuousRequests = ENABLE;
hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
hadc1.Init.OversamplingMode = DISABLE;
hadc1.Init.OversamplingMode = ENABLE;
hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16;
hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_2;
hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
@ -433,7 +439,7 @@ static void MX_ADC1_Init(void)
*/
sConfig.Channel = ADC_CHANNEL_8;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
sConfig.SamplingTime = ADC_SAMPLETIME_6CYCLES_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
@ -743,27 +749,29 @@ static void MX_GPIO_Init(void)
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, AUDIO_OUT_ATTEN_Pin|LD3_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, LED_RED_Pin|LED_GREEN_Pin|LED_YELLOW_Pin, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, PTT_M_Pin|PTT_S_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(AUDIO_OUT_ATTEN_GPIO_Port, AUDIO_OUT_ATTEN_Pin, GPIO_PIN_SET);
/*Configure GPIO pin : PA6 */
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : AUDIO_OUT_ATTEN_Pin */
GPIO_InitStruct.Pin = AUDIO_OUT_ATTEN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
/*Configure GPIO pins : PB0 PB6 PB7 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(AUDIO_OUT_ATTEN_GPIO_Port, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pin : BUTTON_AUDIO_IN_ADJUST_Pin */
GPIO_InitStruct.Pin = BUTTON_AUDIO_IN_ADJUST_Pin;
@ -792,11 +800,12 @@ static void MX_GPIO_Init(void)
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LD3_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : PB5 PB6 PB7 */
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
/*Configure GPIO pin : AUDIO_OUT_ATTEN_Pin */
GPIO_InitStruct.Pin = AUDIO_OUT_ATTEN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(AUDIO_OUT_ATTEN_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : PH3 */
GPIO_InitStruct.Pin = GPIO_PIN_3;
@ -876,6 +885,7 @@ void _Error_Handler(char *file, int line)
void assert_failed(uint8_t* file, uint32_t line)
{
/* USER CODE BEGIN 6 */
_Error_Handler(file, line);
/* User can add his own implementation to report the file name and line number,
tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */

Wyświetl plik

@ -103,6 +103,7 @@ void HAL_MspInit(void)
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(hadc->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspInit 0 */
@ -111,6 +112,14 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
/* Peripheral clock enable */
__HAL_RCC_ADC_CLK_ENABLE();
/**ADC1 GPIO Configuration
PA3 ------> ADC1_IN8
*/
GPIO_InitStruct.Pin = AUDIO_IN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(AUDIO_IN_GPIO_Port, &GPIO_InitStruct);
/* ADC1 DMA Init */
/* ADC1 Init */
hdma_adc1.Instance = DMA1_Channel1;
@ -146,6 +155,11 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
/* USER CODE END ADC1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_ADC_CLK_DISABLE();
/**ADC1 GPIO Configuration
PA3 ------> ADC1_IN8
*/
HAL_GPIO_DeInit(AUDIO_IN_GPIO_Port, AUDIO_IN_Pin);
/* ADC1 DMA DeInit */
HAL_DMA_DeInit(hadc->DMA_Handle);
@ -381,11 +395,16 @@ void HAL_OPAMP_MspInit(OPAMP_HandleTypeDef* hopamp)
PA1 ------> OPAMP1_VINM
PA3 ------> OPAMP1_VOUT
*/
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3;
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = AUDIO_IN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(AUDIO_IN_GPIO_Port, &GPIO_InitStruct);
/* USER CODE BEGIN OPAMP1_MspInit 1 */
/* USER CODE END OPAMP1_MspInit 1 */
@ -409,7 +428,7 @@ void HAL_OPAMP_MspDeInit(OPAMP_HandleTypeDef* hopamp)
PA1 ------> OPAMP1_VINM
PA3 ------> OPAMP1_VOUT
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3);
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1|AUDIO_IN_Pin);
/* USER CODE BEGIN OPAMP1_MspDeInit 1 */

Wyświetl plik

@ -123,7 +123,6 @@ struct Demodulator {
, nrzi_(), hdlc_decoder_(false), locked_(false)
{}
// hdlc::IoFrame* operator()(float* samples, size_t len) __attribute__((section(".bss2")));
hdlc::IoFrame* operator()(float* samples, size_t len);
bool locked() const {return locked_;}

Wyświetl plik

@ -437,6 +437,7 @@ void demodulatorTask() {
bool dcd_status{false};
while (true) {
mobilinkd::tnc::gpio::LD3::off();
osEvent peek = osMessagePeek(audioInputQueueHandle, 0);
if (peek.status == osEventMessage) break;
@ -445,6 +446,7 @@ void demodulatorTask() {
continue;
}
++counter;
mobilinkd::tnc::gpio::LD3::on();
auto block = (adc_pool_type::chunk_type*) evt.value.p;
auto samples = (int16_t*) block->buffer;
@ -536,8 +538,8 @@ void streamLevels(uint32_t channel, uint8_t cmd) {
uint16_t count = 0;
uint32_t accum = 0;
uint16_t min = 4096;
uint16_t max = 0;
uint16_t min = std::numeric_limits<uint16_t>::max();
uint16_t max = std::numeric_limits<uint16_t>::min();
while (count < 2640) {
osEvent evt = osMessageGet(adcInputQueueHandle, osWaitForever);
@ -547,7 +549,7 @@ void streamLevels(uint32_t channel, uint8_t cmd) {
auto block = (adc_pool_type::chunk_type*) evt.value.p;
uint16_t* start = (uint16_t*) block->buffer;
uint16_t* end = (uint16_t*) block->buffer + ADC_BUFFER_SIZE;
uint16_t* end = start + ADC_BUFFER_SIZE;
min = std::min(min, *std::min_element(start, end));
max = std::max(max, *std::max_element(start, end));
@ -586,8 +588,8 @@ levels_type readLevels(uint32_t channel, uint32_t samples) {
uint16_t count = 0;
uint32_t accum = 0;
uint16_t vmin = 4096;
uint16_t vmax = 0;
uint16_t vmin = std::numeric_limits<uint16_t>::max();
uint16_t vmax = std::numeric_limits<uint16_t>::min();
INFO("readLevels: start");
startADC(channel);
@ -597,17 +599,19 @@ levels_type readLevels(uint32_t channel, uint32_t samples) {
osEvent evt = osMessageGet(adcInputQueueHandle, osWaitForever);
if (evt.status != osEventMessage) continue;
count += ADC_BUFFER_SIZE;
auto block = (adc_pool_type::chunk_type*) evt.value.p;
auto start = reinterpret_cast<uint16_t*>(block->buffer);
auto end = start + ADC_BUFFER_SIZE;
auto block = (adc_pool_type::chunk_type*) evt.value.v;
uint16_t* start = (uint16_t*) block->buffer;
uint16_t* end = (uint16_t*) block->buffer + ADC_BUFFER_SIZE;
// if (count == 0) for (auto it = start; it != end; ++it) DEBUG("%hu\n", *it);
vmin = std::min(vmin, *std::min_element(start, end));
vmax = std::max(vmax, *std::max_element(start, end));
accum = std::accumulate(start, end, accum);
adcPool.deallocate(block);
count += ADC_BUFFER_SIZE;
}
stopADC();
@ -619,8 +623,10 @@ levels_type readLevels(uint32_t channel, uint32_t samples) {
return levels_type(pp, avg, vmin, vmax);
}
constexpr uint32_t TWIST_SAMPLE_SIZE = 264 * 5;
/**
* This provides 100Hz resolution to the Goerztel filter.
*/
constexpr uint32_t TWIST_SAMPLE_SIZE = 88;
/*
* Return twist as a the difference in dB between mark and space. The
@ -636,10 +642,10 @@ float readTwist()
float g1200 = 0.0f;
float g2200 = 0.0f;
GoertzelFilter<TWIST_SAMPLE_SIZE, SAMPLE_RATE> gf1200(1200.0);
GoertzelFilter<TWIST_SAMPLE_SIZE, SAMPLE_RATE> gf2200(2200.0);
GoertzelFilter<TWIST_SAMPLE_SIZE, SAMPLE_RATE> gf1200(1200.0, 0);
GoertzelFilter<TWIST_SAMPLE_SIZE, SAMPLE_RATE> gf2200(2200.0, 0);
const uint32_t AVG_SAMPLES = 100;
const uint32_t AVG_SAMPLES = 20;
startADC(channel);
@ -661,17 +667,24 @@ float readTwist()
adcPool.deallocate(block);
}
g1200 += 10.0 * log10(gf1200);
g2200 += 10.0 * log10(gf2200);
g1200 += (gf1200 / count);
g2200 += (gf2200 / count);
gf1200.reset();
gf2200.reset();
}
stopADC();
DEBUG("exit readTwist");
return (g1200 / AVG_SAMPLES) - (g2200 / AVG_SAMPLES);
g1200 = 10.0f * log10f(g1200 / AVG_SAMPLES);
g2200 = 10.0f * log10f(g2200 / AVG_SAMPLES);
auto result = g1200 - g2200;
INFO("Twist = %d / 100 (%d - %d)", int(result*100), int(g1200), int(g2200));
DEBUG("exit readTwist");
return result;
}
/*

Wyświetl plik

@ -65,7 +65,7 @@ void TNC_Error_Handler(int dev, int err);
namespace mobilinkd { namespace tnc { namespace audio {
const uint32_t SAMPLE_RATE = 26400;
constexpr const uint32_t SAMPLE_RATE = 26400;
enum AdcState {
STOPPED, // STOP MODE, wait for comparator
@ -89,33 +89,35 @@ const size_t DMA_TRANSFER_SIZE = ADC_BUFFER_SIZE / 2;
extern uint32_t adc_buffer[]; // Two int16_t samples per element.
inline void stopADC() {
HAL_ADC_Stop_DMA(&hadc1);
HAL_TIM_Base_Stop(&htim6);
if (HAL_ADC_Stop_DMA(&hadc1) != HAL_OK)
Error_Handler();
if (HAL_TIM_Base_Stop(&htim6) != HAL_OK)
Error_Handler();
}
inline void startADC(uint32_t channel) {
ADC_ChannelConfTypeDef sConfig;
sConfig.Channel = channel;
sConfig.Rank = 1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_24CYCLES_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
Error_Handler();
HAL_StatusTypeDef adcStatus = HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
if (adcStatus != HAL_OK) {
Error_Handler();
}
HAL_TIM_Base_Start(&htim6);
HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE * 2);
if (HAL_TIM_Base_Start(&htim6) != HAL_OK)
Error_Handler();
if (HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE * 2) != HAL_OK)
Error_Handler();
}
inline void restartADC() {
HAL_TIM_Base_Start(&htim6);
HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE * 2);
if (HAL_TIM_Base_Start(&htim6) != HAL_OK)
Error_Handler();
if (HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE * 2) != HAL_OK)
Error_Handler();
}
/// Vpp, Vavg, Vmin, Vmax

Wyświetl plik

@ -24,25 +24,25 @@ extern DAC_HandleTypeDef hdac1;
namespace mobilinkd { namespace tnc { namespace audio {
uint16_t virtual_ground;
float i_vgnd;
void setAudioPins(void) {
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Pin = AUDIO_IN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_Init(AUDIO_IN_GPIO_Port, &GPIO_InitStruct);
}
void set_input_gain(int level)
{
uint32_t dc_offset{};
if (HAL_OPAMP_DeInit(&hopamp1) != HAL_OK)
{
if (HAL_OPAMP_Stop(&hopamp1) != HAL_OK)
Error_Handler();
if (HAL_OPAMP_DeInit(&hopamp1) != HAL_OK)
Error_Handler();
}
switch (level) {
case 0: // 0dB
@ -73,49 +73,57 @@ void set_input_gain(int level)
Error_Handler();
}
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, dc_offset);
if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, dc_offset) != HAL_OK)
Error_Handler();
if (HAL_OPAMP_Init(&hopamp1) != HAL_OK)
{
Error_Handler();
}
HAL_OPAMP_Start(&hopamp1);
osDelay(100);
if (HAL_OPAMP_Start(&hopamp1)!= HAL_OK)
Error_Handler();
// setAudioPins();
osDelay(300);
}
int adjust_input_gain() __attribute__((noinline));
int adjust_input_gain() {
INFO("Adjusting input gain...");
INFO("\nAdjusting input gain...\n");
int gain{0};
while (true) {
set_input_gain(gain);
set_input_gain(gain);
auto [vpp, vavg, vmin, vmax] = readLevels(AUDIO_IN);
INFO("\nVpp = %" PRIu16 ", Vavg = %" PRIu16 "\n", vpp, vavg);
INFO("\nVmin = %" PRIu16 ", Vmax = %" PRIu16 ", setting = %d\n", vmin, vmax, gain);
auto [vpp, vavg, vmin, vmax] = readLevels(AUDIO_IN);
while (gain == 0 and (vmax == vref or vmin == 0))
{
gpio::LED_OTHER::toggle();
std::tie(vpp, vavg, vmin, vmax) = readLevels(AUDIO_IN);
INFO("Vpp = %" PRIu16 ", Vavg = %" PRIu16, vpp, vavg);
INFO("Vmin = %" PRIu16 ", Vmax = %" PRIu16 ", setting = %d", vmin, vmax, gain);
while (gain == 0 and (vmax > 4090 or vmin < 5)) {
gpio::LED_OTHER::toggle();
std::tie(vpp, vavg, vmin, vmax) = readLevels(AUDIO_IN);
INFO("Vpp = %" PRIu16 ", Vavg = %" PRIu16 ", Vmin = %" PRIu16
", Vmax = %" PRIu16 ", setting = %d", vpp, vavg, vmin, vmax, gain);
}
gpio::LED_OTHER::off();
virtual_ground = vavg;
if (vpp > 2048) break;
if (gain == 4) break;
++gain;
INFO("\nVpp = %" PRIu16 ", Vavg = %" PRIu16 "\n", vpp, vavg);
INFO("\nVmin = %" PRIu16 ", Vmax = %" PRIu16 ", setting = %d\n", vmin, vmax, gain);
}
auto desired_gain = vref / vpp;
if (desired_gain >= 16) gain = 4;
else if (desired_gain >= 8) gain = 3;
else if (desired_gain >= 4) gain = 2;
else if (desired_gain >= 2) gain = 1;
else gain = 0;
set_input_gain(gain);
std::tie(vpp, vavg, vmin, vmax) = readLevels(AUDIO_IN);
INFO("\nVpp = %" PRIu16 ", Vavg = %" PRIu16 "\n", vpp, vavg);
INFO("\nVmin = %" PRIu16 ", Vmax = %" PRIu16 ", setting = %d\n", vmin, vmax, gain);
virtual_ground = vavg;
i_vgnd = 1.0 / virtual_ground;
gpio::LED_OTHER::on();
return gain;
@ -152,6 +160,11 @@ void setAudioInputLevels()
// setAudioPins();
INFO("Setting input gain: %d", kiss::settings().input_gain);
set_input_gain(kiss::settings().input_gain);
auto [vpp, vavg, vmin, vmax] = readLevels(AUDIO_IN);
INFO("Vpp = %" PRIu16 ", Vavg = %" PRIu16, vpp, vavg);
INFO("Vmin = %" PRIu16 ", Vmax = %" PRIu16 ", setting = %d", vmin, vmax, 2);
virtual_ground = vavg;
i_vgnd = 1.0 / virtual_ground;
}
std::array<int16_t, 128> log_volume;

Wyświetl plik

@ -6,6 +6,7 @@
#include "arm_math.h"
#include "cmsis_os.h"
#include "stm32l4xx_hal.h"
#ifdef __cplusplus
extern "C" {
@ -17,7 +18,7 @@ extern osMessageQId audioInputQueueHandle;
}
#endif
#define AUDIO_IN ADC_CHANNEL_8
constexpr const uint32_t AUDIO_IN = ADC_CHANNEL_8;
namespace mobilinkd { namespace tnc { namespace audio {
@ -27,7 +28,9 @@ void setAudioInputLevels();
void setAudioOutputLevel();
extern bool streamInputDCOffset;
constexpr const uint16_t vref = 16383; // Must match ADC output (adjust when oversampling)
extern uint16_t virtual_ground;
extern float i_vgnd;
}}} // mobilinkd::tnc::audio

Wyświetl plik

@ -74,7 +74,7 @@ struct FirFilter {
float* operator()(int16_t* input) // __attribute__((section(".bss2")))
{
for (size_t i = 0; i != BLOCK_SIZE; i++) {
filter_input[i] = (float(input[i]) - vgnd_) * 0.00048828125f;
filter_input[i] = (float(input[i]) - vgnd_) * audio::i_vgnd;
}
arm_fir_f32(&instance, filter_input, filter_output, BLOCK_SIZE);
return filter_output;

Wyświetl plik

@ -42,6 +42,7 @@ typedef GPIO<(uint32_t)GPIOA_BASE,LED_RED_Pin> LED_TX;
typedef GPIO<(uint32_t)GPIOA_BASE,LED_GREEN_Pin> LED_DCD;
typedef GPIO<(uint32_t)GPIOA_BASE,LED_YELLOW_Pin> LED_OTHER;
typedef GPIO<(uint32_t)GPIOB_BASE,AUDIO_OUT_ATTEN_Pin> AUDIO_OUT_ATTEN;
typedef GPIO<(uint32_t)GPIOB_BASE,LD3_Pin> LD3;
}}} // mobilinkd::tnc::gpio

Wyświetl plik

@ -4,6 +4,8 @@
#ifndef MOBILINKD__TNC__GOERTZEL_FILTER_HPP_
#define MOBILINKD__TNC__GOERTZEL_FILTER_HPP_
#include "AudioLevel.hpp"
#include <arm_math.h>
#include <complex>
@ -17,17 +19,17 @@ class GoertzelFilter
float filterFreq_;
int bin_;
float coeff_;
float d1{0.0f};
float d2{0.0f};
uint32_t count{0};
const float* window_;
float d1{0.0f};
float d2{0.0f};
uint32_t count{0};
const float* window_;
public:
GoertzelFilter(float filter_freq, const float* window = WINDOW)
: filterFreq_(filter_freq)
, bin_(0.5f + ((filter_freq * SAMPLES) / SAMPLE_RATE))
, coeff_(2.0f * cos((2.0f * M_PI * bin_) / float(SAMPLES)))
, window_(window)
, window_(window)
{}
void operator()(float* samples, uint32_t n) {
@ -45,7 +47,7 @@ public:
for (uint32_t i = 0; i != n; ++i) {
float w = window_ ? window_[count] : 1.0;
float sample = (float(samples[i]) - 2048.0f) / 2048.0f;
float sample = (float(samples[i]) - audio::virtual_ground) * audio::i_vgnd;
float y = w * sample + coeff_ * d1 - d2;
d2 = d1;
d1 = y;