本帖最后由 nvjwiciw659 于 2020-5-5 23:20 编辑
接下来试试ADC采集- static rt_thread_t adc_thread = RT_NULL;
- static rt_thread_t printf_thread = RT_NULL;
- #define DISABLE_ALL_CHANNEL 9
- __IO uint16_t ADCVAL;
- int fValue;
- void GPIO_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- /*将PA1配置为模拟输入*/
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- /********************************************************************************************************
- **函数信息 :void ADC1_SingleChannel(uint8_t ADC_Channel_x)
- **功能描述 :配置ADC1单次转换模式
- **输入参数 :ADC_Channel_x , x为0~8
- **输出参数 :无
- ** 备注 :
- ********************************************************************************************************/
- void ADC1_SingleChannel(uint8_t ADC_Channel_x)
- {
- ADC_InitTypeDef ADC_InitStructure;
-
- GPIO_Configuration();
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
-
- /* Initialize the ADC_PRESCARE values */
- ADC_InitStructure.ADC_PRESCARE = ADC_PCLK2_PRESCARE_16;
- /* Initialize the ADC_Mode member */
- ADC_InitStructure.ADC_Mode = ADC_Mode_Single;
- /* Initialize the ADC_ContinuousConvMode member */
- ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
- /* Initialize the ADC_DataAlign member */
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
- /* Initialize the ADC_ExternalTrigConv member */
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
- ADC_Init(ADC1, &ADC_InitStructure);
-
- /*屏蔽所有通道*/
- ADC_RegularChannelConfig(ADC1, DISABLE_ALL_CHANNEL , 0, 0);
- /*使能选中通道,后面参数保留*/
- ADC_RegularChannelConfig(ADC1, ADC_Channel_x, 0, ADC_SampleTime_28_5Cycles);
-
- ADC_Cmd(ADC1, ENABLE);
- }
- /********************************************************************************************************
- **函数信息 :ADC1_SingleChannel_Get()
- **功能描述 :获取ADC1转换数据
- **输入参数 :ADC_Channel_x , x为0~8
- *puiADData ,ADC1实际转换数据
- **输出参数 :ucStatus ,0 表示数据获取失败,1 表示成功
- ********************************************************************************************************/
- u16 ADC1_SingleChannel_Get(uint8_t ADC_Channel_x)
- {
- u16 puiADData;
- /*ADCR寄存器的ADST位使能,软件启动转换*/
- ADC_SoftwareStartConvCmd(ADC1, ENABLE);
- while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0);
- ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
- puiADData=ADC_GetConversionValue(ADC1);
- return puiADData;
- }
- /********************************************************************************************************
- **函数信息 :Get_Adc_Average(uint8_t ADC_Channel_x,uint8_t times)
- **功能描述 :获取几次ADC1采样值的平均值
- **输入参数 :ADC_Channel_x , x为0~8
- **输出参数 :puiADData为ADC读到的值
- ********************************************************************************************************/
- u16 Get_Adc_Average(uint8_t ADC_Channel_x,uint8_t times)
- {
- u32 temp_val=0;
- u8 t;
- u8 delay;
- for(t=0;t<times;t++)
- {
- temp_val+=ADC1_SingleChannel_Get(ADC_Channel_x);
- for(delay=0;delay<100;delay++);
- }
- return temp_val/times;
- }
- /********************************************************************************************************
- * led_init(void)
- ********************************************************************************************************/
- void led_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- void ADC_thread_entry(void* parameter)
- {
- while(1)
- {
- ADCVAL=Get_Adc_Average(ADC_Channel_1,5);
- fValue = (int) (ADCVAL * 825) >> 10;
- rt_thread_delay(500); /* 延时500个tick */
- }
- }
- void PRINTF_thread_entry(void* parameter)
- {
- while(1)
- {
- rt_kprintf("\r\nADC1_CH_1=0x%04X\r\n",ADCVAL);
- rt_kprintf("ADC1_CH_1=%dmV\r\n",fValue);
- rt_thread_delay(500); /* 延时500个tick */
- }
- }
- /********************************************************************************************************
- * adc_task(void)adc任务
- ********************************************************************************************************/
- void adc_task(void)
- {
- adc_thread = /* 线程控制块指针 */
- rt_thread_create( "adc", /* 线程名字 */
- ADC_thread_entry, /* 线程入口函数 */
- RT_NULL, /* 线程入口函数参数 */
- 512, /* 线程栈大小 */
- 2, /* 线程的优先级 */
- 20); /* 线程时间片 */
-
- /* 启动线程,开启调度 */
- if (adc_thread != RT_NULL)
- rt_thread_startup(adc_thread);
- }
- /********************************************************************************************************
- * adc_task(void)adc任务
- ********************************************************************************************************/
- void printf_task(void)
- {
- printf_thread = /* 线程控制块指针 */
- rt_thread_create( "printf", /* 线程名字 */
- PRINTF_thread_entry, /* 线程入口函数 */
- RT_NULL, /* 线程入口函数参数 */
- 512, /* 线程栈大小 */
- 3, /* 线程的优先级 */
- 20); /* 线程时间片 */
-
- /* 启动线程,开启调度 */
- if (printf_thread != RT_NULL)
- rt_thread_startup(printf_thread);
- }
- void mmrtt_init(void)
- {
- ADC1_SingleChannel( ADC_Channel_1);
- adc_task();
- printf_task();
- }
- int main(void)
- {
- led_init();
- mmrtt_init();
- while (1)
- {
- }
- }
|