本帖最后由 jinglixixi 于 2023-1-16 17:16 编辑
LKS32MC037E开发板是专为电机驱动而设计的,但这不妨碍它在其它方面的应用。尽管LKS32MC037E的引脚资源不很多,程序存储空间也只有32K,然而它还是能够完成一定的功能设计的。这里就介绍一种可以进行色彩识别和样本标识的作品,其器件构成如图1所示。 图1 器件构成
其中,为标识样本的色彩值,所采用的显示屏为彩色LCD屏,其几何尺寸为0.96寸,显示分辨率为160*80像素点,其实现的显示效果如图2所示。 图2 LCD屏显示效果
LCD屏与开发板的连接关系如下: SCL---P14 SDA---P16 RST---P04 DC ---P05 CS ---P06 BL ---P07
相关引脚输出高低电平的语句定义为: #define OLED_SCLK_Set() GPIO_WriteBit(GPIO1, GPIO_Pin_4,1) //CLK #define OLED_SCLK_Clr() GPIO_WriteBit(GPIO1, GPIO_Pin_4,0) #define OLED_SDIN_Set() GPIO_WriteBit(GPIO1, GPIO_Pin_6,1) //DIN #define OLED_SDIN_Clr() GPIO_WriteBit(GPIO1, GPIO_Pin_6,0) #define OLED_RST_Set() GPIO_WriteBit(GPIO0, GPIO_Pin_4,1) //RES #define OLED_RST_Clr() GPIO_WriteBit(GPIO0, GPIO_Pin_4,0) #define OLED_DC_Set() GPIO_WriteBit(GPIO0, GPIO_Pin_5,1) //DC #define OLED_DC_Clr() GPIO_WriteBit(GPIO0, GPIO_Pin_5,0) #define OLED_CS_Set() GPIO_WriteBit(GPIO0, GPIO_Pin_6,1) //CS #define OLED_CS_Clr() GPIO_WriteBit(GPIO0, GPIO_Pin_6,0) #define OLED_BLK_Set() GPIO_WriteBit(GPIO0, GPIO_Pin_7,1) //BLK #define OLED_BLK_Clr() GPIO_WriteBit(GPIO0, GPIO_Pin_7,0)
对应的引脚功能配置函数是: void LCD_APP(void)
{
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIO1, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIO1, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIO0, &GPIO_InitStruct);
}
实现SPI方式方式字节数据的函数为: void LCD_Writ_Bus(u8 dat)
{
u8 i;
OLED_CS_Clr();
for(i=0;i<8;i++)
{
OLED_SCLK_Clr();
if(dat&0x80)
{
OLED_SDIN_Set();
}
else
{
OLED_SDIN_Clr();
}
OLED_SCLK_Set();
dat<<=1;
}
OLED_CS_Set();
}
以指定色彩清除屏幕的函数是: void LCD_Clear(u16 Color)
{
u16 i,j;
LCD_Address_Set(0,0,LCD_W-1,LCD_H-1);
for(i=0;i<LCD_W;i++)
{
for (j=0;j<LCD_H;j++)
{
LCD_WR_DATA(Color);
}
}
}
实现图2所示效果的主程序为: int main(void) {
SoftDelay(50000);
__disable_irq();
Hardware_init();
sys_init();
__enable_irq();
OLED_BLK_Set();
Lcd_Init();
LCD_Clear(RED);
BACK_COLOR=RED;
LCD_ShowString(40,10,"LKS32MC037E",YELLOW);
LCD_ShowString(40,30,"LCD Test",YELLOW);
LCD_ShowString(40,55,"jinglixixi",YELLOW);
while (1);
}
为了进行色彩的识别与标识,所用的色彩传感器为TCS34725,它是一款I2C接口的器件。 在测试时,发现其一直无法正常工作,这时才想到是功率底板的问题。
由图3可知,P0.4、P0.5、P0.6是被反电动势检测线路所占用的。 图3 反电动势检测线路
此外,P0.7是被电压检测线路占用的,见图4所示。 图4 电压检测线路
这样就需要重新规划引脚的使用,并脱离开功率底板的约束。 最终分配给TCS34725与开发板相连接的引脚关系为: P06 ---SCL P08---SDA
为此,TCS34725的引脚功能配置函数为: void TCS34725_I2C_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_8;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIO0, &GPIO_InitStruct);
}
设置数据引脚为输入、输出模式的函数分别为: void TCS_SDA_IN()
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIO0, &GPIO_InitStruct);
}
void TCS_SDA_OUT()
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIO0, &GPIO_InitStruct);
}
TCS34725的初始化函数为: u8 TCS34725_Init(void)
{
u8 id=0;
TCS34725_I2C_Init();
TCS34725_Read(TCS34725_ID, &id, 1);
if(id==0x4D | id==0x44)
{
TCS34725_SetIntegrationTime(TCS34725_INTEGRATIONTIME_50MS);
TCS34725_SetGain(TCS34725_GAIN_1X);
TCS34725_Enable();
return 1;
}
return 0;
}
其实现色彩识别的函数为: u8 TCS34725_GetRawData(COLOR_RGBC *rgbc)
{
u8 status = TCS34725_STATUS_AVALID;
TCS34725_Read(TCS34725_STATUS, &status, 1);
if(status & TCS34725_STATUS_AVALID)
{
rgbc->c = TCS34725_GetChannelData(TCS34725_CDATAL);
rgbc->r = TCS34725_GetChannelData(TCS34725_RDATAL);
rgbc->g = TCS34725_GetChannelData(TCS34725_GDATAL);
rgbc->b = TCS34725_GetChannelData(TCS34725_BDATAL);
return 1;
}
return 0;
}
在OLLED屏的配合下,TCS34725终于有检测结果了,见图5和图6所示。 图5 检测电路
图6检测结果
此时,再将LCD屏显示与TCS34725传感器结合起来就可以得到色彩标识的功效,见图7所示。 图7 色彩标识效果
实现图7所示效果的主程序为: int main(void) {
u16 rv,gv,bv,fv;
SoftDelay(50000);
__disable_irq();
Hardware_init();
sys_init();
LCD_APP();
Lcd_Init();
LCD_Clear(BLACK);
LCD_ShowString(20,10,"LKS32MC037E",RED);
LCD_ShowString(20,30,"R: G: B:",YELLOW);
LCD_color(RED);
LCD_box(109,29,130,50);
TCS34725_Init();
TCS34725_GetRawData(&rgb);
while(1)
{
TCS34725_GetRawData(&rgb);
rv=rgb.r*255/rgb.c;
gv=rgb.g*255/rgb.c;
bv=rgb.b*255/rgb.c;
LCD_ShowNum(0,50,rv,4,YELLOW);
LCD_ShowNum(32,50,gv,4,YELLOW);
LCD_ShowNum(64,50,bv,4,YELLOW);
fv=((rv>>3)<<11)+((gv>>2)<<5)+(bv>>3);
LCD_color(fv);
SoftDelay(500000);
}
}
此外,对其它色彩的识别效果如图8至图10所示。 图8 识别蓝色
图9 识别粉色
图10 识别浅绿色
至此,LKS32MC037E开发板的测评目标就完成了,整体来说效果还是较为理想的。在此再次对活动的组织者和凌鸥创芯的产品表示感谢!
|
优秀