在线时间108 小时
UID3332856
注册时间2016-11-28
NXP金币365
TA的每日心情 | 擦汗 2024-11-7 09:48 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
金牌会员
 
- 积分
- 1243
- 最后登录
- 2025-7-11
|
本帖最后由 北方. 于 2024-11-6 09:48 编辑
1. 概述
极简数字水平仪是响应版主召唤的抢单任务双十一抢单+圆梦任务:送LPC55S69、华为手环、硬盘。
这个是完全采用FRDM-MCXC444开发板的板载资源集成三轴传感器和段式液晶显示屏实现的模拟功能。融合【MCXC444分享】如何读取传感器数据以及【MCXC444分享】使用SLCD两个项目实现的功能。就是通过读取FXLS三轴传感器的x-y轴数据,整形后显示在4位段码显示屏上,正好可以显示各两位,前面2位是x轴的数据,后面2位是y轴数据。按照FRDM-MCXC444的发帖计划正好要整合这个项目,恰好用最低门槛满足抢任务的条件,就抛砖引玉一下。确实要赞一下FRDM-MCXC444这个开发板,具有非常好的原型开发功能,这个数字水平仪的精度和响应速度是相当的可以。可以直接做成工业品也没有问题。
2. 使用的硬件和软件
2.1 使用的硬件是FRDM-MCXC444
FRDM-MCXC444采用Arm® Cortex® -M0+内核,主频为48MHz,具有高达256kB的闪存和32kB的RAM。板载三轴传感器,模拟光照亮度传感器以及SLCD屏。
2.2 使用的软件是Keil和FRDM-MCXC444的软件开发包。其中包括从pack Installer上参考的范例程序。
3. 功能逻辑图
这个功能非常简单,就是启动程序,读取fxsl传感器的数据,暂停1000毫秒,然后反向各个段位置零,刷屏为空白屏。
4. 代码解析
主循环代码如下
- int main(void)
- {
- slcd_config_t slcd_config;
-
- fxls_handle_t fxlsHandle = {0};
- fxls_accel_data_t accelData = {0};
- fxls_config_t fxls_config = {0};
- status_t result;
- uint8_t sensorRange = 0;
- uint8_t dataScale = 0;
- int16_t xAngle = 0;
- int16_t yAngle = 0;
- int16_t xDuty = 0;
- int16_t yDuty = 0;
- int16_t position = 0;
- int16_t digit_slcd = 0;
- int16_t digit_fxls = 0;
-
-
- /* Hardware initialize. */
- BOARD_InitPins();
- BOARD_BootClockRUN();
- BOARD_I2C_ReleaseBus();
- BOARD_I2C_ConfigurePins();
- BOARD_InitDebugConsole();
- /* Enable the MCGIRCLK */
- MCG->C1 |= MCG_C1_IRCLKEN_MASK;
- /* I2C initialize & Configure the I2C function*/
- BOARD_Accel_I2C_Init();
- fxls_config.I2C_SendFunc = BOARD_Accel_I2C_Send;
- fxls_config.I2C_ReceiveFunc = BOARD_Accel_I2C_Receive;
- fxls_config.slaveAddress = g_accel_address;
- PRINTF("\r\nPoppy Starts.\r\n");
- /* SLCD get default configure. */
- /*
- * slcd_config.displayMode = kSLCD_NormalMode;
- * slcd_config.powerSupply = kSLCD_InternalVll3UseChargePump;
- * slcd_config.voltageTrim = kSLCD_RegulatedVolatgeTrim08;
- * slcd_config.lowPowerBehavior = kSLCD_EnabledInWaitStop;
- * slcd_config.frameFreqIntEnable = false;
- * slcd_config.faultConfig = NULL;
- */
- SLCD_GetDefaultConfig(&slcd_config);
- /* Verify and Complete the configuration structure. */
- slcd_config.clkConfig = &slcdClkConfig;
- slcd_config.loadAdjust = kSLCD_HighLoadOrSlowestClkSrc;
- slcd_config.dutyCycle = APP_SLCD_DUTY_CYCLE;
- slcd_config.slcdLowPinEnabled = APP_SLCD_LOW_PIN_ENABLED;
- slcd_config.slcdHighPinEnabled = APP_SLCD_HIGH_PIN_ENABLED;
- slcd_config.backPlaneLowPin = APP_SLCD_BACK_PANEL_LOW_PIN;
- slcd_config.backPlaneHighPin = APP_SLCD_BACK_PANEL_HIGH_PIN;
- slcd_config.faultConfig = NULL;
-
-
- /* SLCD Initialize. */
- SLCD_Init(LCD, &slcd_config);
- BOARD_SetSlcdBackPlanePhase();
- memset(&slcdEngine, 0, sizeof(tSLCD_Engine));
- SLCD_Engine_Init(&slcdEngine, SLCD_SetLCDPin);
- /* Starts SLCD display. */
- SLCD_StartDisplay(LCD);
- //SLCD_Show_Digital();
- //SLCD_Show_Icon();
- SLCD_Blink();
- //PRINTF("\r\nSLCD Stops Display.\r\n");
- /* Stops SLCD display. */
- //SLCD_StopDisplay(LCD);
- PRINTF("\r\nPoppy Ends.\r\n");
-
-
- /* Initialize fxls sensor devices */
- result = FXLS_Init(&fxlsHandle, &fxls_config);
- if (result != kStatus_Success)
- {
- PRINTF("\r\nSensor device initialize failed!\r\n");
- return -1;
- }
- /* Get sensor range */
- if (FXLS_ReadReg(&fxlsHandle, SENS_CONFIG1_REG, &sensorRange, 1) != kStatus_Success)
- {
- return -1;
- }
- sensorRange = (sensorRange & 0x6) >> 1;
- if (sensorRange == 0x00)
- {
- dataScale = 2U;
- }
- else if (sensorRange == 0x01)
- {
- dataScale = 4U;
- }
- else if (sensorRange == 0x10)
- {
- dataScale = 8U;
- }
- else if (sensorRange == 0x11)
- {
- dataScale = 16U;
- }
- else
- {
- }
- while (1)
- {
- if (FXLS_ReadAccelData(&fxlsHandle, &accelData) != kStatus_Success)
- {
- return -1;
- }
- /* Convert raw data to angle (normalize to 0-90 degrees). No negative angles. */
- xAngle = (int16_t)floor((double)accelData.accelX * (double)dataScale * 90 / 2048);
- yAngle = (int16_t)floor((double)accelData.accelY * (double)dataScale * 90 / 2048);if (xAngle < 0)
- {
- xAngle *= -1;
- }
- if (yAngle < 0)
- {
- yAngle *= -1;
- }
- digit_fxls=xAngle*100 + yAngle;
- digit_slcd=digit_fxls;
-
- for (position = 0; position < NUM_POSEND; position++)
- {
- SLCD_Engine_Show_Num(&slcdEngine, digit_slcd-round(digit_slcd/10)*10, NUM_POSEND-position-1, 1);
- digit_slcd=round(digit_slcd/10);
- }
-
- SLCD_TimeDelay(1000);
- digit_slcd=digit_fxls;
- for (position = 0; position < NUM_POSEND; position++)
- {
- SLCD_Engine_Show_Num(&slcdEngine, digit_slcd-round(digit_slcd/10)*10, NUM_POSEND-position-1, 0);
- digit_slcd=round(digit_slcd/10);
- }
- /* Print out the angle data. */
- PRINTF("x= %2d y = %2d\r\n", xAngle, yAngle);
- }
- }
复制代码
5. 效果演示
5.1 串口调试输出控制
调用putty的串口管理器
显示首先测试slcd屏,随后就隔1000毫秒输出一次采集数据,这个采集频率可以提高到100Hz以上,为了演示效果,降到这个数值。
如下图。
视频演示如下
6 附件代码压缩版如下
poppy.zip
(322.02 KB, 下载次数: 0)
|
|