查看: 557|回复: 2

【双十一抢单】圆梦任务1-极简数字水平仪

[复制链接]
  • TA的每日心情
    擦汗
    2024-11-7 09:48
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    35

    主题

    82

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1243
    最后登录
    2025-7-11
    发表于 2024-11-5 17:01:13 | 显示全部楼层 |阅读模式
    本帖最后由 北方. 于 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屏。
    Capture.PNG
    2.2 使用的软件是Keil和FRDM-MCXC444的软件开发包。其中包括从pack Installer上参考的范例程序。
    screenshot-1730785372022.png

    3. 功能逻辑图
        这个功能非常简单,就是启动程序,读取fxsl传感器的数据,暂停1000毫秒,然后反向各个段位置零,刷屏为空白屏。
    Capture.PNG
    4. 代码解析
    主循环代码如下
    1. int main(void)
    2. {
    3.     slcd_config_t slcd_config;
    4.         
    5.     fxls_handle_t fxlsHandle    = {0};
    6.     fxls_accel_data_t accelData = {0};
    7.     fxls_config_t fxls_config        = {0};
    8.     status_t result;
    9.     uint8_t sensorRange     = 0;
    10.     uint8_t dataScale       = 0;
    11.     int16_t xAngle          = 0;
    12.     int16_t yAngle          = 0;
    13.     int16_t xDuty           = 0;
    14.     int16_t yDuty           = 0;
    15.     int16_t position        = 0;
    16.     int16_t digit_slcd      = 0;
    17.     int16_t digit_fxls      = 0;
    18.                
    19.                
    20.     /* Hardware initialize. */
    21.     BOARD_InitPins();
    22.     BOARD_BootClockRUN();               
    23.     BOARD_I2C_ReleaseBus();
    24.     BOARD_I2C_ConfigurePins();
    25.     BOARD_InitDebugConsole();
    26.     /* Enable the MCGIRCLK */
    27.     MCG->C1 |= MCG_C1_IRCLKEN_MASK;
    28.     /* I2C initialize & Configure the I2C function*/
    29.     BOARD_Accel_I2C_Init();
    30.     fxls_config.I2C_SendFunc    = BOARD_Accel_I2C_Send;
    31.     fxls_config.I2C_ReceiveFunc = BOARD_Accel_I2C_Receive;
    32.     fxls_config.slaveAddress    = g_accel_address;


    33.     PRINTF("\r\nPoppy Starts.\r\n");

    34.     /* SLCD get default configure. */
    35.     /*
    36.      * slcd_config.displayMode = kSLCD_NormalMode;
    37.      * slcd_config.powerSupply = kSLCD_InternalVll3UseChargePump;
    38.      * slcd_config.voltageTrim = kSLCD_RegulatedVolatgeTrim08;
    39.      * slcd_config.lowPowerBehavior = kSLCD_EnabledInWaitStop;
    40.      * slcd_config.frameFreqIntEnable = false;
    41.      * slcd_config.faultConfig = NULL;
    42.      */
    43.     SLCD_GetDefaultConfig(&slcd_config);
    44.     /* Verify and Complete the configuration structure. */
    45.     slcd_config.clkConfig          = &slcdClkConfig;
    46.     slcd_config.loadAdjust         = kSLCD_HighLoadOrSlowestClkSrc;
    47.     slcd_config.dutyCycle          = APP_SLCD_DUTY_CYCLE;
    48.     slcd_config.slcdLowPinEnabled  = APP_SLCD_LOW_PIN_ENABLED;
    49.     slcd_config.slcdHighPinEnabled = APP_SLCD_HIGH_PIN_ENABLED;
    50.     slcd_config.backPlaneLowPin    = APP_SLCD_BACK_PANEL_LOW_PIN;
    51.     slcd_config.backPlaneHighPin   = APP_SLCD_BACK_PANEL_HIGH_PIN;
    52.     slcd_config.faultConfig = NULL;
    53.                
    54.                
    55.     /* SLCD Initialize. */
    56.     SLCD_Init(LCD, &slcd_config);
    57.     BOARD_SetSlcdBackPlanePhase();
    58.     memset(&slcdEngine, 0, sizeof(tSLCD_Engine));
    59.     SLCD_Engine_Init(&slcdEngine, SLCD_SetLCDPin);

    60.     /* Starts SLCD display. */
    61.     SLCD_StartDisplay(LCD);
    62.     //SLCD_Show_Digital();
    63.     //SLCD_Show_Icon();
    64.     SLCD_Blink();
    65.     //PRINTF("\r\nSLCD Stops Display.\r\n");
    66.     /* Stops SLCD display. */
    67.     //SLCD_StopDisplay(LCD);

    68.     PRINTF("\r\nPoppy Ends.\r\n");
    69.                
    70.                
    71.     /* Initialize fxls sensor devices */
    72.     result = FXLS_Init(&fxlsHandle, &fxls_config);
    73.     if (result != kStatus_Success)
    74.     {
    75.         PRINTF("\r\nSensor device initialize failed!\r\n");
    76.         return -1;
    77.     }
    78.     /* Get sensor range */
    79.     if (FXLS_ReadReg(&fxlsHandle, SENS_CONFIG1_REG, &sensorRange, 1) != kStatus_Success)
    80.     {
    81.         return -1;
    82.     }
    83.     sensorRange = (sensorRange & 0x6) >> 1;
    84.     if (sensorRange == 0x00)
    85.     {
    86.         dataScale = 2U;
    87.     }
    88.     else if (sensorRange == 0x01)
    89.     {
    90.         dataScale = 4U;
    91.     }
    92.     else if (sensorRange == 0x10)
    93.     {
    94.         dataScale = 8U;
    95.     }
    96.     else if (sensorRange == 0x11)
    97.     {
    98.         dataScale = 16U;
    99.     }
    100.     else
    101.     {
    102.     }

    103.     while (1)
    104.     {
    105.                           if (FXLS_ReadAccelData(&fxlsHandle, &accelData) != kStatus_Success)
    106.         {
    107.             return -1;
    108.         }
    109.         /* Convert raw data to angle (normalize to 0-90 degrees). No negative angles. */
    110.         xAngle = (int16_t)floor((double)accelData.accelX * (double)dataScale * 90 / 2048);
    111.         yAngle = (int16_t)floor((double)accelData.accelY * (double)dataScale * 90 / 2048);if (xAngle < 0)
    112.         {
    113.             xAngle *= -1;
    114.         }
    115.         if (yAngle < 0)
    116.         {
    117.             yAngle *= -1;
    118.         }
    119.                                 digit_fxls=xAngle*100 + yAngle;
    120.                                 digit_slcd=digit_fxls;
    121.                                 
    122.                                 for (position = 0; position < NUM_POSEND; position++)
    123.         {
    124.             SLCD_Engine_Show_Num(&slcdEngine, digit_slcd-round(digit_slcd/10)*10, NUM_POSEND-position-1, 1);
    125.                                                 digit_slcd=round(digit_slcd/10);
    126.         }
    127.                                 
    128.                                 SLCD_TimeDelay(1000);
    129.                                 digit_slcd=digit_fxls;
    130.                                 for (position = 0; position < NUM_POSEND; position++)
    131.         {
    132.             SLCD_Engine_Show_Num(&slcdEngine, digit_slcd-round(digit_slcd/10)*10, NUM_POSEND-position-1, 0);
    133.                                                 digit_slcd=round(digit_slcd/10);
    134.         }

    135.         /* Print out the angle data. */
    136.         PRINTF("x= %2d y = %2d\r\n", xAngle, yAngle);
    137.     }
    138. }
    复制代码


    5. 效果演示
    5.1 串口调试输出控制
    调用putty的串口管理器
    Capture.PNG
    显示首先测试slcd屏,随后就隔1000毫秒输出一次采集数据,这个采集频率可以提高到100Hz以上,为了演示效果,降到这个数值。
    screenshot-1730785372022.png
    如下图。
    screenshot-1730785372022.png
    视频演示如下

    6 附件代码压缩版如下
    poppy.zip (322.02 KB, 下载次数: 0)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    7 天前
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3868

    主题

    7472

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39223
    最后登录
    2025-7-18
    发表于 2024-11-5 17:15:40 | 显示全部楼层
    属实速度
    qiandao qiandao
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-10 23:03
  • 签到天数: 1502 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4688

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10080
    最后登录
    2025-7-2
    发表于 2024-11-7 15:51:11 | 显示全部楼层
    这DIY! 都有实用价值啊
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-18 13:25 , Processed in 0.086084 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表