5. 一拖多调VCOM
本章节主要介绍如何在自动调VCOM的基础上,进一步实现一拖多调VCOM的功能。
主要内容:
1 添加设置不同对象VCOM和GetFlick函数
2 添加不同对象调VCOM流程
3 添加初始化
4 启动不同对象的线程
5 一拖多调VCOM示例
注意
如果还未点屏成功,请到前面的章节学习如何点亮屏幕
如果还未成功初始化镜头或者校准镜头,请到前面的章节学习如何使用
如果还未了解过线程使用方法,请到 Micropython特定的库 查看 线程 的章节学习如何使用
5.1. 添加设置不同对象VCOM和GetFlick函数:
def SetVCOM_0(vcom): vcomh = (vcom>>8)&0x03 vcoml = vcom&0xff SHARP_user.My_MIPI_Board[0].MIPI_WR((0x29, 0xD5, vcomh,vcoml,vcomh,vcoml,vcomh,vcoml)) user_mode.Delay_ms(10) return 1 def GetFlick_0(): for i in range(20): try: CA410_DB = SHARP_user.My_CA410_0.COMCA410_GetdB(1) user_mode.Delay_ms(100) return 1,CA410_DB except Exception as e: if i==19: raise e def SetVCOM_1(vcom): vcomh = (vcom>>8)&0x03 vcoml = vcom&0xff SHARP_user.My_MIPI_Board[1].MIPI_WR((0x29, 0xD5, vcomh,vcoml,vcomh,vcoml,vcomh,vcoml)) user_mode.Delay_ms(10) return 1 def GetFlick_1(): for i in range(20): try: CA410_DB = SHARP_user.My_CA410_1.COMCA410_GetdB(1) user_mode.Delay_ms(100) return 1,CA410_DB except Exception as e: if i==19: raise e
5.2. 添加不同对象调VCOM流程:
方法
AutoVcom_ScanRange用于实现 在规定的范围内 从小到大扫描,找到最佳VCOM。(是VCOM从小到底 不是闪烁从小到大)
vcom_min- 最小VCOM值,开始值
vcom_max- 最大VCOM值,结束值
step- VCOM递增的阶数
step_delay_ms- 每一步间隔时时间返回
res- >0 : 扫描完成; <=0 : 负数出错,结束。返回
Value- 查找到最佳VCOM
方法
AutoVcom_ScanDef用于实现 从默认值开始扫描,寻找最佳VCOM
vcom_def- VCOM默认值,以这个值为中心值寻找最佳VCOM
step- VCOM递增的阶数
step_delay_ms- 每一步间隔时时间返回
res- >0 : 扫描完成; <=0 : 负数出错,结束。返回
Value- 查找到最佳VCOMdef AutoOTP_0(): print("threadName AutoOTP_0") t_start_0 = user_mode.MeasureTimeStart_ms() SHARP_user.Auto_VCOM_0.one_vcom_flag = 0 user_mode.Delay_ms(1000) if SHARP_user.Auto_VCOM_0.one_vcom_flag == 0: user_mode.DEBUG("AutoOTP_0 : 1 scan vcom ..\r\n") res,Value =SHARP_user.Auto_VCOM_0.Auto_Vcom_Object.AutoVcom_ScanRange(0x250,0x290,5,500) print("AutoOTP_0 : 1 scan vcom end") if res<0: print("AutoOTP_0 : scan error1") SHARP_user.task0.release() #释放锁 return 0 print("AutoOTP_0 : 1 scan vcom ok") print("AutoOTP_0 : 1 good vcom =%d "%Value) user_mode.DEBUG("AutoOTP_0 : 1 good vcom =%d\n"%Value) SHARP_user.Auto_VCOM_0.center_vcom = Value #保存VCOM中心值 SHARP_user.Auto_VCOM_0.one_vcom_flag = 1 #第一次找值标志位置一,下次不再进行第一次找值 #第二次 进行中心值的小范围找值 print("AutoOTP_0 : 2 scan vcom...") res,Value = SHARP_user.Auto_VCOM_0.Auto_Vcom_Object.AutoVcom_ScanDef(SHARP_user.Auto_VCOM_0.center_vcom, 2, 300) if res<0: print("AutoOTP_0 : scan error2\r\n") SHARP_user.task0.release() #释放锁 return 0 print("AutoOTP_0 : 2 scan vcom ok") print("AutoOTP_0 : 2 good vcom =%d "%Value) user_mode.DEBUG("2 good vcom =%d\n"%Value) #第三次 进行精准找值 print("AutoOTP_0 : 3 scan vcom ...") res,Value = SHARP_user.Auto_VCOM_0.Auto_Vcom_Object.AutoVcom_ScanRange(Value - 2, Value + 2, 1, 500) if res<0: print("AutoOTP_0 : scan error3") SHARP_user.task0.release() #释放锁 return 0 print("AutoOTP_0 : 3 scan vcom ok") print("AutoOTP_0 : 3 good vcom =%d "%Value) user_mode.DEBUG("AutoOTP_0 : 3 good vcom =%d\n"%Value) SHARP_user.Auto_VCOM_0.VCOM_VAL = Value #保存最佳VCOM print("AutoOTP_0 : vcom scan time =%.2f s"%((user_mode.GetMeasureTime_ms(t_start_0))/1000.0)) SHARP_user.task0.release() #释放锁 def AutoOTP_1(): print("threadName AutoOTP_1") t_start_1 = user_mode.MeasureTimeStart_ms() SHARP_user.Auto_VCOM_1.one_vcom_flag = 0 user_mode.Delay_ms(1000) if SHARP_user.Auto_VCOM_1.one_vcom_flag == 0: user_mode.DEBUG("AutoOTP_1 : 1 scan vcom ..\r\n") res,Value =SHARP_user.Auto_VCOM_1.Auto_Vcom_Object.AutoVcom_ScanRange(0x250,0x290,5,500) print("AutoOTP_1 : 1 scan vcom end") if res<0: print("AutoOTP_1 : scan error1") SHARP_user.task1.release() #释放锁 return 0 print("AutoOTP_1 : 1 scan vcom ok") print("AutoOTP_1 : 1 good vcom =%d "%Value) user_mode.DEBUG("AutoOTP_1 : 1 good vcom =%d\n"%Value) SHARP_user.Auto_VCOM_1.center_vcom = Value #保存VCOM中心值 SHARP_user.Auto_VCOM_1.one_vcom_flag = 1 #第一次找值标志位置一,下次不再进行第一次找值 #第二次 进行中心值的小范围找值 print("AutoOTP_1 : 2 scan vcom...") res,Value = SHARP_user.Auto_VCOM_1.Auto_Vcom_Object.AutoVcom_ScanDef(SHARP_user.Auto_VCOM_1.center_vcom, 2, 300) if res<0: print("scan error2\r\n") SHARP_user.task1.release() #释放锁 return 0 print("AutoOTP_1 : 2 scan vcom ok") print("AutoOTP_1 : 2 good vcom =%d "%Value) user_mode.DEBUG("AutoOTP_1 : 2 good vcom =%d\n"%Value) #第三次 进行精准找值 print("AutoOTP_1 : 3 scan vcom ...") res,Value = SHARP_user.Auto_VCOM_1.Auto_Vcom_Object.AutoVcom_ScanRange(Value - 2, Value + 2, 1, 500) if res<0: print("AutoOTP_1 : scan error3") SHARP_user.task1.release() #释放锁 return 0 print("AutoOTP_1 : 3 scan vcom ok") print("AutoOTP_1 : 3 good vcom =%d "%Value) user_mode.DEBUG("3 good vcom =%d\n"%Value) SHARP_user.Auto_VCOM_1.VCOM_VAL = Value #保存最佳VCOM print("AutoOTP_1 : vcom scan time =%.2f s"%((user_mode.GetMeasureTime_ms(t_start_1))/1000.0)) SHARP_user.task1.release() #释放锁
5.3. 添加初始化:
在main函数初始化时候添加。
1.在硬件初始化函数之后实现,实例化不同对象调vcom 类
2.实例化不同对象的探头模块类
3.实例化不同对象的
SHARP_Auto_Vcom用于自动调vcom 类-Debug 打印函数, None–打印 1–Print 打印 打印函数–按打印函数的格式打印
-Set_VCOM 设置vcom 函数 函数形式:
SetVCOM(vcom),return写入成功与否返回值-GetFlick 获取flick 函数 函数形式:
GetFlick(),return读取成功与否返回值,flick值
创建互斥锁,用于线程阻塞
class User_Fun(): Auto_VCOM_0 = User_Auto_VCOM() #实例化调vcom 类 Auto_VCOM_1 = User_Auto_VCOM() #实例化调vcom 类 My_CA410_0 = COMCA410(SHARP_Multi_BusRS232_init(id=1),1,0,id=1) My_CA410_1 = COMCA410(SHARP_Multi_BusRS232_init(id=3),1,0,id=3) Auto_VCOM_0.Auto_Vcom_Object=SHARP_Auto_Vcom(user_mode.DEBUG,SetVCOM_0,GetFlick_0) Auto_VCOM_1.Auto_Vcom_Object=SHARP_Auto_Vcom(user_mode.DEBUG,SetVCOM_1,GetFlick_1) task0 = _thread.allocate_lock() #创建互斥锁 task1 = _thread.allocate_lock() #创建互斥锁
5.4. 启动不同对象的线程
本章通过创建多个线程的方式,同时启动不同对象调VCOM流程,实现一拖多调VCOM
_thread.start_new_thread(function,args [,kwargs])用于启动指定对象的线程
function: 要启动的函数
args: 函数的参数列表(必须是元组)
kwargs: 指定关键字参数的字典(可选)_thread.start_new_thread(AutoOTP_0,()) #启动线程 _thread.start_new_thread(AutoOTP_1,()) #启动线程
5.5. 一拖多调VCOM示例
from sharp_user import user_mode,SHARP_Multi_BusRS232_init from sharp_auto_vcom import * from sharp_lens import COMCA410 import _thread class User_Auto_VCOM(): #调vcom使用的类 Auto_Vcom_Object = 0 # vcom_adap = 0 #硬件设备 one_vcom_flag = 0 #第一次vcom查找标志位 center_vcom = 0 #vcom中心值 VCOM_VAL = 0 #最佳VOCM值 def SetVCOM_0(vcom): vcomh = (vcom>>8)&0x03 vcoml = vcom&0xff SHARP_user.My_MIPI_Board[0].MIPI_WR((0x29, 0xD5, vcomh,vcoml,vcomh,vcoml,vcomh,vcoml)) user_mode.Delay_ms(10) return 1 def GetFlick_0(): for i in range(20): try: CA410_DB = SHARP_user.My_CA410_0.COMCA410_GetdB(1) user_mode.Delay_ms(100) return 1,CA410_DB except Exception as e: if i==19: raise e def SetVCOM_1(vcom): vcomh = (vcom>>8)&0x03 vcoml = vcom&0xff SHARP_user.My_MIPI_Board[1].MIPI_WR((0x29, 0xD5, vcomh,vcoml,vcomh,vcoml,vcomh,vcoml)) user_mode.Delay_ms(10) return 1 def GetFlick_1(): for i in range(20): try: CA410_DB = SHARP_user.My_CA410_1.COMCA410_GetdB(1) user_mode.Delay_ms(100) return 1,CA410_DB except Exception as e: if i==19: raise e ######################### 调vcom流程 ######################################## def AutoOTP_0(): print("threadName AutoOTP_0") t_start_0 = user_mode.MeasureTimeStart_ms() SHARP_user.Auto_VCOM_0.one_vcom_flag = 0 user_mode.Delay_ms(1000) if SHARP_user.Auto_VCOM_0.one_vcom_flag == 0: user_mode.DEBUG("AutoOTP_0 : 1 scan vcom ..\r\n") res,Value =SHARP_user.Auto_VCOM_0.Auto_Vcom_Object.AutoVcom_ScanRange(0x250,0x290,5,500) print("AutoOTP_0 : 1 scan vcom end") if res<0: print("AutoOTP_0 : scan error1") SHARP_user.task0.release() #释放锁 return 0 print("AutoOTP_0 : 1 scan vcom ok") print("AutoOTP_0 : 1 good vcom =%d "%Value) user_mode.DEBUG("AutoOTP_0 : 1 good vcom =%d\n"%Value) SHARP_user.Auto_VCOM_0.center_vcom = Value #保存VCOM中心值 SHARP_user.Auto_VCOM_0.one_vcom_flag = 1 #第一次找值标志位置一,下次不再进行第一次找值 #第二次 进行中心值的小范围找值 print("AutoOTP_0 : 2 scan vcom...") res,Value = SHARP_user.Auto_VCOM_0.Auto_Vcom_Object.AutoVcom_ScanDef(SHARP_user.Auto_VCOM_0.center_vcom, 2, 300) if res<0: print("AutoOTP_0 : scan error2\r\n") SHARP_user.task0.release() #释放锁 return 0 print("AutoOTP_0 : 2 scan vcom ok") print("AutoOTP_0 : 2 good vcom =%d "%Value) user_mode.DEBUG("2 good vcom =%d\n"%Value) #第三次 进行精准找值 print("AutoOTP_0 : 3 scan vcom ...") res,Value = SHARP_user.Auto_VCOM_0.Auto_Vcom_Object.AutoVcom_ScanRange(Value - 2, Value + 2, 1, 500) if res<0: print("AutoOTP_0 : scan error3") SHARP_user.task0.release() #释放锁 return 0 print("AutoOTP_0 : 3 scan vcom ok") print("AutoOTP_0 : 3 good vcom =%d "%Value) user_mode.DEBUG("AutoOTP_0 : 3 good vcom =%d\n"%Value) SHARP_user.Auto_VCOM_0.VCOM_VAL = Value #保存最佳VCOM print("AutoOTP_0 : vcom scan time =%.2f s"%((user_mode.GetMeasureTime_ms(t_start_0))/1000.0)) SHARP_user.task0.release() #释放锁 def AutoOTP_1(): print("threadName AutoOTP_1") t_start_1 = user_mode.MeasureTimeStart_ms() SHARP_user.Auto_VCOM_1.one_vcom_flag = 0 user_mode.Delay_ms(1000) if SHARP_user.Auto_VCOM_1.one_vcom_flag == 0: user_mode.DEBUG("AutoOTP_1 : 1 scan vcom ..\r\n") res,Value =SHARP_user.Auto_VCOM_1.Auto_Vcom_Object.AutoVcom_ScanRange(0x250,0x290,5,500) print("AutoOTP_1 : 1 scan vcom end") if res<0: print("AutoOTP_1 : scan error1") SHARP_user.task1.release() #释放锁 return 0 print("AutoOTP_1 : 1 scan vcom ok") print("AutoOTP_1 : 1 good vcom =%d "%Value) user_mode.DEBUG("AutoOTP_1 : 1 good vcom =%d\n"%Value) SHARP_user.Auto_VCOM_1.center_vcom = Value #保存VCOM中心值 SHARP_user.Auto_VCOM_1.one_vcom_flag = 1 #第一次找值标志位置一,下次不再进行第一次找值 #第二次 进行中心值的小范围找值 print("AutoOTP_1 : 2 scan vcom...") res,Value = SHARP_user.Auto_VCOM_1.Auto_Vcom_Object.AutoVcom_ScanDef(SHARP_user.Auto_VCOM_1.center_vcom, 2, 300) if res<0: print("scan error2\r\n") SHARP_user.task1.release() #释放锁 return 0 print("AutoOTP_1 : 2 scan vcom ok") print("AutoOTP_1 : 2 good vcom =%d "%Value) user_mode.DEBUG("AutoOTP_1 : 2 good vcom =%d\n"%Value) #第三次 进行精准找值 print("AutoOTP_1 : 3 scan vcom ...") res,Value = SHARP_user.Auto_VCOM_1.Auto_Vcom_Object.AutoVcom_ScanRange(Value - 2, Value + 2, 1, 500) if res<0: print("AutoOTP_1 : scan error3") SHARP_user.task1.release() #释放锁 return 0 print("AutoOTP_1 : 3 scan vcom ok") print("AutoOTP_1 : 3 good vcom =%d "%Value) user_mode.DEBUG("3 good vcom =%d\n"%Value) SHARP_user.Auto_VCOM_1.VCOM_VAL = Value #保存最佳VCOM print("AutoOTP_1 : vcom scan time =%.2f s"%((user_mode.GetMeasureTime_ms(t_start_1))/1000.0)) SHARP_user.task1.release() #释放锁 class User_Fun(): Auto_VCOM_0 = User_Auto_VCOM() #实例化调vcom 类 Auto_VCOM_1 = User_Auto_VCOM() #实例化调vcom 类 My_CA410_0 = COMCA410(SHARP_Multi_BusRS232_init(id=1),1,0,id=1) My_CA410_1 = COMCA410(SHARP_Multi_BusRS232_init(id=3),1,0,id=3) Auto_VCOM_0.Auto_Vcom_Object=SHARP_Auto_Vcom(user_mode.DEBUG,SetVCOM_0,GetFlick_0) Auto_VCOM_1.Auto_Vcom_Object=SHARP_Auto_Vcom(user_mode.DEBUG,SetVCOM_1,GetFlick_1) task0 = _thread.allocate_lock() #创建互斥锁 task1 = _thread.allocate_lock() #创建互斥锁 SHARP_user=User_Fun() if __name__ == '__main__': user_mode.DEBUG("Enter Python OK !") try: SHARP_user.My_CA410_0.COMCA410_Cal0() #校准镜头 SHARP_user.My_CA410_1.COMCA410_Cal0() #校准镜头 print('410_1_zero OK\n') break except Exception as e: print("410_1_zero NG\r") task_start_time = user_mode.MeasureTimeStart_ms() SHARP_user.task0.acquire() #获取锁 SHARP_user.task1.acquire() #获取锁 #一拖多 _thread.start_new_thread(AutoOTP_0,()) #启动线程 _thread.start_new_thread(AutoOTP_1,()) #启动线程 #一拖一 # AutoOTP_0() # AutoOTP_1() while(SHARP_user.task0.locked()==True or SHARP_user.task1.locked()==True): #等待锁释放 user_mode.Delay_ms(1) print("Task Time : %.2f s" %(user_mode.GetMeasureTime_ms(task_start_time)/1000.0))