制作过程
要实现功能:将传感器电阻的变化引起的电压的变化和设定的阈值进行比较,当人没有坐下时,输出高电平1;当人坐下时,输出低电平0.
首先通过电阻分压将电阻的变化转化为电压的变化,然后通过LM393比较器对该电压和阈值电压进行比较。
电路图如下所示:
通过一个滑动变阻器来模拟压力传感器输出,当没有人坐下时,压力传感器输出电阻无穷大,此时A点的电压接近VCC=5v
当有人坐下时,压力传感器输出电阻为20K左右,此时A点电压接近400mV
为了滤除传感器输出信号的噪声,采用了两阶的低通滤波,设定低通滤波的截止频率为20Hz,这样,可以有效地避免意外的干扰,提高准确性。
通过滑动变阻器设定阈值为3V。
故可以得到
当没有人坐下时,Vin+ > Vin- , 输出为高电平
当有人坐下时, Vin+ < Vin- , 输出为低电平
1)驱动舵机部分
舵机是一种通过PWM占空比来进行调节的位置伺服型电机,简而言之,是通过PWM的占空比大小调节舵机转动的角度,一般舵机需要的PWM的频率是50Hz(周期20ms),对于180度转动的舵机来说,高电平的时间一般是0.5ms----2.5ms之间,对应于0---180°。
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
故,我们只需要开一个定时器,产生20ms的一个pwm方波,然后,调节占空比就可以控制该舵机转动相应的角度。利用TIM3 CH1----PA6产生20ms的一个pwm方波。
程序如下:
//TIM3 pwm初始化
//freq:产生pwm的频率
//pre:分频比
//duty:占空比
//TIM3 CH1 ---- PA6
//TIM3 CH2 ---- PA7
//TIM3 CH3 ---- PB0
//TIM3 CH4 ---- PB1
void TIM3_PWM_Init(u16 freq,u16 pre,u16 duty)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //打开TIM3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); //复用功能打开
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //复用功能打开
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置PC6为复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //将TIM3完全映射PC3-->PC6 TIM3 CH1
TIM_TimeBaseStructure.TIM_Period = freq; //TIM3参数配置
TIM_TimeBaseStructure.TIM_Prescaler = pre;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, & TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM模式配置
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = duty;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //极性为低,这样可以保证当duty变大时,led变亮
TIM_OC1Init(TIM3, & TIM_OCInitStructure); //使能TIM3 CH1
// TIM_SetCompare1(TIM3, duty);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3 CH1的CCR1预装载
TIM_Cmd(TIM3, ENABLE); //开TIM3
}
2)信号读取
通过PC6脚来读取传感器比较输出的信号,当检测到低电平时,让舵机转动180度,若是高电平,则,一直保持在0度
配置PC6引脚为上拉输入状态
由于没有其他事情要做,故直接在主循环中进行引脚电平状态的读取,一下是源代码
if(SIN1 == 0)
{
delay_ms(10);
if(SIN1 == 0)
TIM_SetCompare1(TIM3, 2475); //对TIM3 CH1 比较寄存器重新赋值,此时正脉冲宽度2475ms,对应于180度反转
else
TIM_SetCompare1(TIM3, 575);
}
}
以上就是大致所做,有不合理的地方,还望指点。源程序见附件!
------smtudou
2017/7/18
|