我们经常看到小车绕着黑色的道走,并能不离开这条道,为什么? 因为循迹的存在 红外循迹,即芯片TCRT5000红外发射二极管不断发射红外线,,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平:若不是黑色,就会反射回来芯片,若为黑色,则不会反射(被吸收); 黑色,芯片上开关提示的灯会熄灭,通过AO或者DO会返回1,不是黑色,则相反。
对应VCC连单片机3.3v,GND连GND
DO和AO,指输入,这里涉及ADC知识,即用ADC去获取值,DO返回是0/1,AO返回0-4000+的值
我们可以用
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)
来读取该输入值,注意!!这里应该是INPUTData而不是OUTPUT,输入指的是传感器捕获的东西,输出是我们供给单片机的东西 AD模块代码(驱动TCRT5000)
#include "stm32f10x.h"
#include "AD.h"
void AD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//ADC得激活,就像tim一样
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//复合输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//我们要用DO(数字信号返回,就值激活这个GPIO口就行了,即这个PB0连接DO)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1) == SET);
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_13Cycles5);//
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
uint16_t AD_GetValue(void)
{
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}
**这里必须强调,ADC模块要设置的是获取通道,我们必须根据硬件设计来调制参数 ** 就是下面这两个
ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_13Cycles5);//最后一个参数是指每次捕获的采样时钟,可以查阅一下,注意分频有一个14mhz限制,采样时钟频率不能太高
这个是江科大的-对应STM32F103C8T6的输入通道配置,我们要根据这里去进行参数配置,这样即可完成配置
然后主函数就 AD_Init()-> AD_GetValue()即可