本帖最后由 lfshit 于 2015-12-23 11:06 编辑
一、 FSR400薄膜压力传感器 FSR400薄膜压力传感器用于测量一定受力区域的正压力的一种薄膜传感器,根据正压力不同,输出电阻值不同。淘宝上面有卖,60元左右,实物如下图左图所示。虽然有些小贵,但是测试中发现输出值很稳定,只要标定好了,那么传感器的精度还是蛮高的。该款传感器具体参数如下: 1.尺寸:厚(0.48毫米),作用区外径7.6mm 2.电阻范围:无限/开路(无压力),100KΩ(压光),200Ω(最大压力100N) 3.测力范围:0.2 N(30KΩ)到100N(200Ω) 注:FSR400最大测力100N(1000Ω),不符合下图,需重新校验、标定。 对于我们采购的这片力传感器,实验中标定出其压力—电阻—电压取值如下表:
4.电源:使用小于1mA的电流(取决于上拉/下拉电阻和电源电压) 5.采集输出电路: 注:本次实验中,电位计R值选为15 KΩ。
二、 手爪夹取力反馈方案实现
手爪夹取力反馈原理及实现:将薄膜力传感器贴在机械臂手爪内侧,单边贴即可,将力传感器输出端与定值电位器串联分压,总压3.3V,即无压力状态。随着压力增大,输出电压逐渐减小,有明确的对应关系,见上表。 这个电压接入到手爪控制芯片STM32F030F4P6的PA5口,使用ADC_CH5,(由于没实现双通道ADC同时工作,暂时把源程序中的温度ADC先关了…待完善攻克)。 程序里对这个电压执行判断,若小于一定值,则停止转动,保持当前位置。 测试中,可达到预定目标。只是需针对不同抓取物,设置不同的抓取力。 测试过程中有时会出现的问题:爪子动作不灵敏…电机嗡嗡响,但是运动传递不到爪子那,执行不了动作。
试验系统实物图
三、 附STM32部分程序//GPIOA_Pin_5 SETTING ADC!!! GPIO_InitStructure.GPIO_Pin= GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //32F1xx为AIN,此处为AN GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); //判断输入压力值,控制机械臂手爪动作。 if(ADC1ConvertedValue<2100) { inverse_speed=0x0fff; normal_speed=0x0a00; GPIO_SetBits(GPIOA,GPIO_Pin_2); } else { inverse_speed=0xffff; normal_speed=0xa000; GPIO_ResetBits(GPIOA,GPIO_Pin_2); } //ADC配置函数 static void ADC_Config(void) { ADC_InitTypeDef ADC_InitStructure; /* ADC1 Periph clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* ADCs DeInit */ ADC_DeInit(ADC1); /* Initialize ADC structure */ ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge =ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward; ADC_Init(ADC1, &ADC_InitStructure); /* Convert the ADC1 Channel 5 with 239.5 Cycles as sampling time */ ADC_SampleTime_239_5Cycles);// ADC_ChannelConfig(ADC1,ADC_Channel_5, ADC_SampleTime_239_5Cycles);// /*ADC Calibration */ ADC_GetCalibrationFactor(ADC1); //ADC_TempSensorCmd(ENABLE); /* Enable the ADC peripheral */ ADC_Cmd(ADC1, ENABLE); /* Wait the ADRDY flag */ while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY)); /* ADC1 regular Software Start Conv */ ADC_StartOfConversion(ADC1); }
|