| 制作过程 
 
        要实现功能:将传感器电阻的变化引起的电压的变化和设定的阈值进行比较,当人没有坐下时,输出高电平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
  
 
 |