无线充电手持式根管治疗仪(结项)
管治疗术(RootCanal Therapy,RCT)是现在最有用,最高效的治疗病变根管的方法。它使用特定的仪器设备和手段对根管进行清理、修形,然后利用药品来杀灭病菌,最后严密的填充根管并填充根管。从而达到控制感染,修复破损点,促使根尖周病变的痊愈或者达到预防根尖周病变发生的目的。
无线充电手持式根管治疗仪是为了解决上面提出问题而被设计开发出来的。动力部分的方案一般采用可以提供大扭矩的微型直流电与相应驱动控制电路。微型直流电经过起到减速作用的机械结构(如减速箱、机械转头)后减慢电机速度、放大电机扭力从而可以带动挫针完成根管扩大的目标,最后也由此成功代替手工根管扩大。
图1根管治疗仪
在这里我先描述基本的硬件原理图。
图二系统框图
一个优秀的电机驱动电路对系统的核心元件微直流电机的性能有关键的影响作用。电机驱动应该满足以下要求,驱动的输入阻抗大,输出波形、频率稳定,做调整时响应快,有一定的抗干扰能力。:
使用开关管和肖特基二极管搭建分立式的H桥电机驱动电路。因为H桥使用的元件简洁,使用电机类型广泛、成本低等优点,H桥电机驱动电路在电机控制领域得到广泛应用。
图三H桥原理图
该电流采样电路是以TI公司的四运放芯片TLV2374为核心搭建的。它通过一个采样电阻利用底边检流的方式把电流信号转化为电压信号。电压信号通过单元测量放大电路(及差分放大电路)放大后可以通过主控芯片内置的ADC模块采集得到。经过这一系列的处理,通过数学计算公式我们可以把电压与电机的力矩联系起来。电流file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png与电压file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png之间的数学公式如公式3-1。电流file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png与力矩file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.png之间的数学公式如公式3-2。
转矩常数放映电机产生的扭矩和电机消耗的电流的关系。
单元测量放大电路(及差分放大电路)与同比例放大运算放大器,反比例放大运算放大器相对比优势如下。
(1) 因为大大的提高了信噪比,所以抗干扰能力也大大增强。
(2) 在保证有关电阻严格对称的条件下,各电阻阻值的误差对该电路共模抑制比KCMRR没有影响。
(3) 电路对共模信号几乎没有放大作用,共模电压增益接近零。
差分放大电路的原理图如图4所示。输入信号两端差值的放大倍数数学表达式如公式3-3所示。
图四差分放大电路的原理图
在设计中我们采用了OLED_12864液晶显示屏,它能满足下列的参数要求:
(1) 显示清晰,画面对比度好。
(2) 体积小。
(3) 使用IIC协议或者SPI协议驱动。
(4) 能够同时显示多行。
(5) 可以锂电池3.7V供电。
OLED_12864液晶显示屏幕加上电源引脚,总共只有4个引脚。这要归功于Philips开发出的串行通信协议。是多主器件串行数据通信总线。器件可以在主/ 从环境下通信,在该环境下,由主器件发起通信。可通过寻址控制从器件。该通信协议属于半双工作的工作模式。通信的速率有100k,308k,400k等多种速率可选,标准为400k。在实际使用中我们用到了使用主控芯片内置的MSSP模块里的主从模式。通信速率设定为100k,且通信速率可以编程调节。通过设定对应的寄存器的值可以实现改变通信速率。例如FOSC 32 MHz ,FCY 8 MHz ,BRG 13h,速率400 kHz。通过编程控制我们可以快捷的找到能使我们液晶屏幕稳定的通信速率。
软件部分我们将详细的描述语音处理算法,IIC通信协议。
下面放出自己写的IIC通信底层函数
extern void IICinit()
{
SSPIE=1;
SSPIF=0;
GIE=1;
TRISC4=1;
TRISC3=1; //ê1ó?RC3-SCL£?RC4-SDA 0x80 10,k 0x00 400k
SSPSTAT=0x80; //0x00£?2éó?400KHz?£ê? 0X80ê?100k
SSPCON1=0x38;//001(SSPEN?a′?DDí¨??)1(CKP??μ??????D£?òò?aI2C±?D??óé?à-μ?×è£??ùò?éè?¨??μ??????D)1000 I2C?÷??·?ê?£?ê±?ó=Fosc/[4*(SSPAD+1)]
SSPCON2=0X00; //
SSPCON3=0X6B;
SSPMSK=0X00;
SSPADD=0X4F; //?úI2C?÷???÷μ?1¤×÷·?ê???£?????′??÷±?ó?×÷2¨ì??ê·¢éú?÷μ??¨ê±2?êy×°????′??÷ 4FH 100K,13H 400K
}
extern void IIC_Start()
{
// SSPEN=1;
RSEN=1;
SSPIF=0;
SEN=1;
//delay(1);
RSEN=1;
}
extern void IIC_Stop()
{
while(SSPIF==0);
SSPIF=0;
PEN=1; //í£?1I2C×ü??
while(SSPIF==0);
SSPIF=0;
//delay(1);
}
extern void Write_IIC_Byte(unsigned char data)
{
while(SSPIF==0);
SSPIF=0;
SSPBUF=data; //D′è?EEPROMêy?Y
}
PS:不要问我注释后面为什么会有乱码,我也不知道。
我们使用到IIC的主模式接收的MODE。典型的发送序列如下所示。
(1) 用户通过将SSPCON2 寄存器的SEN 位置1 来产生启动条件。
(2) 启动条件完成时, SSPIF 由硬件置1。
(3) SSPIF 由软件清零。
(4) 用户将要发送的从地址写入SSPBUF 且R/W 位置1。
(5)地址将移出SDA 引脚,直到所有8 位发送完毕。写SSPBUF便开始发送。
(6)MSSP 模块移入来自从器件的ACK 位,并将其值写入SSPCON2 寄存器的ACKSTAT 位。
(7) 在第9 个时钟周期结束时, MSSP 模块通过将SSPIF 位置1 产生中断。
(8) 用户将SSPCON2 寄存器的RCEN 位置1,主器件随着时钟移入来自从器件的字节。
(9)在SCL 的第8 个下降沿后,SSPIF 和BF 置1。
(10) 主器件清零SSPIF,并从SSPBUF 中读取接收到的字节,清零BF。
(11) 主器件在SSPCON2 寄存器的ACKDT 位中设置将发送给从器件的ACK 值,并通过将ACKEN 位置1 发送ACK。
(12) 主器件随着时钟将ACK 移出到从器件, SSPIF置1。
(13) 用户清零SSPIF。
(14) 对于每个从从器件接收的字节,重复第8-13 步。
(15) 主器件发送非ACK 或停止位以结束通信。
下面将会从算法到程序简洁的描述语音识别的思路。
/*---------------------------------------------------------------------------------------------------------*/
#define k_nMemSize 9792//9728//(10 * 1024) //9.5KB
INT nMemSize = k_nMemSize;
__align(4) BYTE lpbyMemPool[k_nMemSize];
/*---------------------------------------------------------------------------------------------------------*/
/* Main Function */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DoVR_sep(uint32_t lpbyBaseModel, uint32_t lpbyModel, uint32_t bShowOnly, uint32_t nTimeOut, uint32_t nPinOn, int (*funcCheckKeyPress)(void))
{
HANDLE hCSpotter = NULL;
INT n, nRet;
BYTE nID, nLED, nWait;
SHORT *lpsSample;
INT nNumSample;
n = CSpotter_GetMemoryUsage_Sep((BYTE *)lpbyBaseModel, (BYTE *)lpbyModel);
hCSpotter = CSpotter_Init_Sep((BYTE *)lpbyBaseModel, (BYTE *)lpbyModel, lpbyMemPool, nMemSize, &nRet);
if (hCSpotter == NULL)
goto L_ERROR;
Wave_StartRecord();
nWait = 0;
nRet = 0;
CSpotter_Reset(hCSpotter);
while (1)
{
if (funcCheckKeyPress && (nID = funcCheckKeyPress()) > 0)
{
nRet = nID;
break;
}
nNumSample = Wave_GetSample(&lpsSample);
if (nNumSample < 0)
break;
if (nNumSample == 0)
continue;
if (CSpotter_AddSample(hCSpotter, lpsSample, nNumSample) == CSPOTTER_SUCCESS)
{
nID = CSpotter_GetResult(hCSpotter);
nLED = nID + 1;
if (Wave_CheckCpuOverload())
{
// nLED |= 0x40;
Wave_ClearCpuOverload();
}
nLED |= nPinOn;
ShowLED(nLED);
if (bShowOnly == 0)
{
nRet = nID + 1;
break;
}
nWait = 0;
DrvUART_Write(UART_PORT0,&nID,1); //confid 20150603
// printf("%x",nID);
LEDOFF0;
LEDOFF1;
LEDOFF2;
LEDOFF3;
LEDOFF4;
nID += 1;
#if 0
if(nID&0x01)
{LEDON0;}
if(nID&0x02)
{LEDON1;}
if(nID&0x04)
{LEDON2;}
if(nID&0x08)
{LEDON3;}
if(nID&0x10)
{LEDON4;}
// if(nID == 0x00) //
// {LEDON0;LEDON1;LEDON2;LEDON3;LEDON4;}
#else
if(nID == 0x01) // è??a?£ê?
{
LEDON0;LEDON1;LEDON2;LEDON3;LEDON4;
}
else if(nID == 0x02) // ía3??£ê?
{
//LEDOFF0;LEDOFF1;LEDOFF2;LEDOFF3;LEDOFF4;
}
else if(nID == 0x03) // ·????a??
{
LEDON0;LEDON1;LEDON2;
}
else if(nID == 0x04) // ·???1?±?
{
LEDOFF0;LEDOFF1;LEDOFF2;
}
else
{
if(nID&0x01)
{LEDON0;}
if(nID&0x02)
{LEDON1;}
if(nID&0x04)
{LEDON2;}
if(nID&0x08)
{LEDON3;}
if(nID&0x10)
{LEDON4;}
// if(nID == 0x00) //
// {LEDON0;LEDON1;LEDON2;LEDON3;LEDON4;}
}
#endif
}
Wave_UnlockSample(&lpsSample);
nWait++;
if (nTimeOut > 0 && nWait >= nTimeOut)
break; }
L_ERROR:
Wave_StopRecord();
CSpotter_Release(hCSpotter);
return nRet;
}
这一段程序可以对特定的语义进行识别。我们里面设定的是”扭矩“总结实际的视频已经放链接,目前识别的速度准确性都没有达到要求,目前无法商用。下面是部分的实拍视屏链接。还有一个视频已经加入到帖子视屏上传功能,只是我不太熟悉,我也找不到。http://pan.baidu.com/s/1mh5YTQw学习了解一下 感谢分享
视频链接呢
您好,能否将这个开发板的U盘所带资料发给小弟我学习学习,最近正好在用这个芯片。QQ邮箱496631097。感激不尽。