设计采用STM8S105K4芯片,AIN0和AIN1分别接直流电平,配置为多通道连续扫描模式。对采样值进行200次的平均。测试中发现AIN1通道始终为零,AIN0通道正常。对照手册仔细检查了几次代码,仍未发现问题,请高手指点!
程序代码如下:
main.c代码
- void main ( void )
- {
- uint16_t x_sen_data, y_sen_data;
- uint16_t cnt = 0;
- CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV4);
- UartInit();
- AdcInit();
- printf("Hello, My Board.\n");
- while (1)
- {
- // ADC采样结束
- if (TRUE == g_samp_update_flag)
- {
- g_samp_update_flag = FALSE;
- // 进行调平处理
- GetAdcValue(&x_sen_data, &y_sen_data);
- printf("%d %d\n", x_sen_data, y_sen_data);
- AdcInit();
- }
- }
- }
[color=rgb(51, 102, 153) !important]复制代码
adc.c代码
- // 采样数据长度
- #define DATA_LEN (200)
- bool g_samp_update_flag = FALSE;
- ///@ 定义文件局部变量
- static uint32_t m_x_sen_sum = 0;
- static uint32_t m_y_sen_sum = 0;
- static void delay_ms(uint32_t ms)
- {
- while (ms--);
- }
- // ADC初始化
- void AdcInit(void)
- {
- // 配置ADC相关引脚
- GPIO_Init(SCR_PORT, SCR_PIN, GPIO_MODE_OUT_PP_LOW_SLOW);
- GPIO_Init(SGY_PORT, SGY_PIN, GPIO_MODE_IN_FL_NO_IT);
- GPIO_Init(SGX_PORT, SGX_PIN, GPIO_MODE_IN_FL_NO_IT);
- // 复位ADC1
- ADC1_DeInit();
- // 配置ADC1
- ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_1, ADC1_PRESSEL_FCPU_D4,
- ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT,
- ADC1_SCHMITTTRIG_CHANNEL1, DISABLE);
- ///@ 从ADC上电到开始ADC转换要间隔7us
- // 连续转换模式
- ADC1_ScanModeCmd(ENABLE);
- // 使能EOC中断
- ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE);
- // 使能全局中断
- enableInterrupts();
- delay_ms(200);
- ///@ 是否够7us?也许是转换不稳定的主要原因
- // Start ADC Conversion
- ADC1_StartConversion();
- }
- // ADC中断处理程序
- void AdcISR(void)
- {
- static uint8_t samp_times = 0;
- uint16_t adc_data[2] = { 0, 0 };
- // 读取采样点
- adc_data[0] = ADC1_GetBufferValue(0x00);
- adc_data[1] = ADC1_GetBufferValue(0x01);
- // 采样数据处理
- m_x_sen_sum += adc_data[0];
- m_y_sen_sum += adc_data[1];
- // 清除中断标志
- ADC1_ClearITPendingBit(ADC1_IT_EOC);
- // 采样点计数
- samp_times++;
- if (DATA_LEN == samp_times)
- {
- samp_times = 0;
- // g_sample_flag = FALSE;
- g_samp_update_flag = TRUE;
-
- // 关闭ADC
- ADC1_Cmd(DISABLE);
- }
- }
- // 获取ADC采样值
- void GetAdcValue(uint16_t *p_data_x, uint16_t *p_data_y)
- {
- *p_data_x = m_x_sen_sum / DATA_LEN;
- *p_data_y = m_y_sen_sum / DATA_LEN;
- m_x_sen_sum = 0;
- m_y_sen_sum = 0;
- }
[color=rgb(51, 102, 153) !important]复制代码
[color=rgb(51, 102, 153) !important]
|