灵动微电子(MindMotion)生产的 MM32G0001 系列单片机模块,这是一款针对轻量级嵌入式应用市场的低成本 MCU。
测试的核心是 ADC 外设采集能力,即将模拟信号输入 ADC 引脚,并读取数字转换结果。
- ADC 输入端设备或信号源连接
- MCU 配置 ADC 寄存器与触发机制
- 实时读取 ADC 采样结果
代码:
ADC配置程序:
void ADC_Configure(void)
{
ADC_InitTypeDef ADC_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1ENR_ADC1, ENABLE);
ADC_StructInit(&ADC_InitStruct);
ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStruct.ADC_PRESCARE = ADC_PCLK1_PRESCARE_16;
ADC_InitStruct.ADC_Mode = ADC_Mode_Scan;
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC_Init(ADC1, &ADC_InitStruct);
ADC_SampleTimeConfig(ADC1, ADC_Samctl_240_5);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB, ENABLE);
/* PA12(RV1) PB0(RV2) PA7(RV3) */
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_12;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStruct);
ADC_Cmd(ADC1, ENABLE);
}
/***********************************************************************************************************************
* @brief
* @note none
* @param none
* @retval none
*********************************************************************************************************************/
float ADC_GetChannelVoltage(ADCCHANNEL_TypeDef Channel)
{
uint16_t Value = 0;
float Voltage;
ADC_ANY_NUM_Config(ADC1, 0);
ADC_ANY_CH_Config(ADC1, 0, Channel);
ADC_ANY_Cmd(ADC1, ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (RESET == ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC))
{
}
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
Value = ADC_GetConversionValue(ADC1);
ADC_ANY_Cmd(ADC1, DISABLE);
Voltage = (float)Value / (float)4096 * (float)3.3;
return (Voltage);
}
/***********************************************************************************************************************
* @brief
* @note none
* @param none
* @retval none
*********************************************************************************************************************/
float voltage[2];
void ADC_AnyChannel_SingleConversion_Polling_Sample(void)
{
printf("\r\nTest %s", __FUNCTION__);
ADC_Configure();
while (1)
{
printf("\r\nRV1 Voltage = %0.2f \tRV2 Voltage = %0.2f \tRV3 Voltage = %0.2f",
ADC_GetChannelVoltage(ADC_Channel_3),
ADC_GetChannelVoltage(ADC_Channel_1),
ADC_GetChannelVoltage(ADC_Channel_7));
voltage[0] = ADC_GetChannelVoltage(ADC_Channel_3);//PA12
voltage[1] = ADC_GetChannelVoltage(ADC_Channel_7);//PA7
PLATFORM_DelayMS(500);
}
}
主程序:
int main(void)
{
PLATFORM_Init();
ADC_AnyChannel_SingleConversion_Polling_Sample();
while (1)
{
}
}

开源社区 


