- 2025-03-25
-
回复了主题帖:
测评入围名单: 国民技术高性能MCU N32H487开发板
个人信息无误,确认可以完成测评分享计划。
-
回复了主题帖:
【航芯ACM32F403开发板测评】+NTC温度检测及PTC加热台控制
秦天qintian0303 发表于 2025-3-25 08:53
说实话不太好调,ti好像有个标准末班,该参数就行
以前看它们用仿真软件设参数后看前行变化趋势来定方案,后来就没再接触。
但没有PID调节,其温度的滞后效应很严重,再断电后依然会爬升几度。
-
回复了主题帖:
【航芯ACM32F403开发板测评】+NTC温度检测及PTC加热台控制
秦天qintian0303 发表于 2025-3-24 21:54
没加个PID控制啊
应该加,没做过需要充电。
- 2025-03-24
-
回复了主题帖:
>>征集 | 晒电机控制痛点与难题,一起寻求最优解!
痛点问题可以为:芯片选型、效率优化、控制精度、抗干扰性、成本控制、算法、安全、电磁干扰、热管理、工具使用等开发相关内容。
目前市面上有不少电机控制板,通过这种控制板可以大大地化解驱动的难度和问题。但在实际使用时,也存在一些问题,就是在使用时需要掌握一些电机的参数及参数配置的知识,没有这方面的支持,也是存在一定
障碍的,自己就曾为体验某家电机控制板的性能,而购置直流无刷电机,接上后,通过调节电位,电机也能够转动,但电机转速的调节范围很窄,转速不是很丝滑,甚至会出现一定的特动。但想要调节参数时却发现,该电机却没有配置相应的名牌,没有相应的参数支持也就无法达到运行品质的提高,这便是痛点问题之一,若是在电机控制板上配置相应的参数检测功能,实现参数的自匹配来优化运行品质将是一件非常有意义的事情。
-
发表了主题帖:
【航芯ACM32F403开发板测评】+NTC温度检测及PTC加热台控制
本帖最后由 jinglixixi 于 2025-3-24 17:25 编辑
前面曾介绍过单通道的A/D检测方法,将它与NTC热敏电阻相结合即可进行温度测控。
为此,这里是选取通道1来连接NTC进行温度检测,即用PA7来连接NTC的模拟信号输出端。
为指示控制状态,是通过板载的LED( PF3),点亮时为加热的状态,熄灭时表示停止状态。
实现温度检测的功能函数为:
void ADC_Test_Polling_Nchannels(void)
{
uint32_t i, VrefP, Voltage;
uint32_t lu32_COM_OK = 0;
uint32_t t;
VrefP = ADC_GetVrefP(ADC_CHANNEL_8);
ADC_Init_Polling_Nchannels();
while(1)
{
System_Delay_MS(500);
for (i = 0; i < BUFFER_LENGTH; i++)
{
gu32_AdcBuffer[i] = 0;
}
HAL_ADC_Polling(&ADC_Handle, gu32_AdcBuffer, ADC_Handle.ChannelNum, 0);
for (i = 13; i < 14; i++)
{
Voltage = (gu32_AdcBuffer[i]&0xFFF)*VrefP/4095;
t=bh(Voltage);
if(t>26)
{
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_3, GPIO_PIN_SET);
OLED_ShowString(80,6,"OF",16);
}
else
{
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_3, GPIO_PIN_CLEAR);
OLED_ShowString(80,6,"ON",16);
}
OLED_ShowNum(80,2,t,3,16);
}
}
}
实现温度测控的主程序为:
int main(void)
{
System_Init();
Uart_Init();
Oled_Config();
OLED_Init();
OLED_Clear();
OLED_ShowString(10,0,"Simulation",16);
OLED_ShowString(0,2,"h= t=",16);
OLED_ShowString(0,4,"H= T= 26",16);
OLED_ShowString(16,6,"OF OF",16);
JDQ_Init();
ADC_Test_Polling_Nchannels();
while(1)
{
}
}
经程序的编译和下载,其测试结果如图2和图3所示。
图2 线路连接
图3 温度测控
图4 PTC加热控制
- 2025-03-21
-
回复了主题帖:
【新年花灯】莫负时光砥砺前行
本帖最后由 jinglixixi 于 2025-3-21 20:40 编辑
图1 器件布局
图2 器件连接关系
图3 开发板PCB
参考程序:
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //结构定义
GPIO_InitStructure.Pin = GPIO_Pin_All; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P1,&GPIO_InitStructure); //初始化
GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);
}
/******************** 主函数 **************************/
void main(void)
{
u8 i,tmp;
GPIO_config();
while(1)
{
tmp = 1;
for(i=0; i<8; i++)
{
P3 = ~tmp;
tmp <<= 1;
delay_ms(250);
}
...
tmp = 0x80;
for(i=0; i<8; i++)
{
P3 = ~tmp;
tmp >>= 1;
delay_ms(250);
}
...
}
}
- 2025-03-18
-
回复了主题帖:
【泰坦触觉 TITAN Core开发套件】无线通讯在触觉感知控制器中的使用
freebsder 发表于 2025-3-18 17:14
这是命题作文?
有创意DIY参考建议
-
回复了主题帖:
【泰坦触觉 TITAN Core开发套件】无线通讯在触觉感知控制器中的使用
Jacktang 发表于 2025-3-18 07:45
毕竟也用NRF2401模块实现了触觉感知无线控制功能,还行
哈哈,慢慢改进提高吧!
- 2025-03-14
-
发表了主题帖:
【泰坦触觉 TITAN Core开发套件】无线通讯在触觉感知控制器中的使用
本帖最后由 jinglixixi 于 2025-3-16 15:28 编辑
由于触觉感知控制器的特殊性,要求控制器与触觉马达之间必须采用无线通讯的方式,且要求触觉马达一侧必须足够的小并能耗低,这都是硬性的指标。
在无法短期内无法直接实现开发板间的蓝牙通讯的情况下,只好退而退而求其次,以其它的方式来实现无线通讯,其构成方式如图1所示。
图1 构成形式
在该处理方式中,是由单片机和NRF2401模块构成了2个无线通讯的收发单元。当一方处于发送方时,另一方则转为接收方。
若左侧按下发送键,则右侧的LED灯被点亮,表示触觉马达受控处于工作状态。当然由于双方的地位是对等的,当右侧按下发送键,则左侧的LED灯被点亮(注:在触觉感知控制器中,则只是单向传送控制指令)。
图2 左侧控制右侧
图3 右侧控制左侧
以此为基础,在添加串行通讯的情况下,就可以由控制器来发送指令,由触觉马达来接收指令来实现无线控制的目标。
图4 控制器一侧
图5 触觉马达一侧
图6 无线通讯控制马达
图7 通讯直接控制马达
注 :后期以采用套件核心板上的驱动芯片为宜。
图8 整体测试
无线通信演示:
[localvideo]10af947166e1a02603518969fbb6e04f[/localvideo]
无线控制马达:
[localvideo]234e0d99c894409df0d31b044e53e662[/localvideo]
无线直控马达:
[localvideo]73015cd61091802e8a96753a0455447d[/localvideo]
整体测试:
[localvideo]ed38f7c30399d10fdd22316362ae10e2[/localvideo]
- 2025-03-10
-
回复了主题帖:
【航芯ACM32F403开发板测评】+PWM功能测试
秦天qintian0303 发表于 2025-3-9 09:46
看样子在做检测的时候好的注意点电磁兼容的防护
的确是一种启示
- 2025-03-09
-
回复了主题帖:
【航芯ACM32F403开发板测评】+PWM功能测试
lugl4313820 发表于 2025-3-8 15:44
占空比好象有跳动呀,闪得不是很流畅,是视频减少了帧数原因吗?
的确如此,似乎是电流不足,抖动后就熄灭了。
- 2025-03-08
-
回复了主题帖:
【航芯ACM32F403开发板测评】+PWM功能测试
Jacktang 发表于 2025-3-8 11:21
手指随意地划过PC8引脚,则会产生不同的占空比,这个测试强
纯属无意间的发现
- 2025-03-07
-
发表了主题帖:
【航芯ACM32F403开发板测评】+PWM功能测试
利用ACM32F403的定时器可实现多种PWM方面的应用,这里就以2个实际测试加以介绍。
1.LED灯亮度调节
在通常情况下,PWM调节的示例多是采用较高频率的输出,因此不借助示波器是较难观察的。
为了便于观察,这里是用TIM3作定时器,以PA7输出PWM,并通过占空比的调节来改变LED的亮度。
图1 线路连接
TIM3的初始化函数为:
void TIM3_Init(void)
{
TIM_OC_InitTypeDef Tim_OC_Init_Para;
uint32_t timer_clock;
timer_clock = System_Get_APBClock();
TIM_Handler.Instance = TIM3;
TIM_Handler.Init.ARRPreLoadEn = TIM_ARR_PRELOAD_ENABLE;
TIM_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
TIM_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
TIM_Handler.Init.RepetitionCounter = 0;
TIM_Handler.Init.Prescaler = (timer_clock/TIM_CLOCK_FREQ) - 1;
TIM_Handler.Init.Period = (TIM_CLOCK_FREQ/v) - 1;
TIM3_MSP_Pre_Init(&TIM_Handler);
HAL_TIMER_Base_Init(&TIM_Handler);
Tim_OC_Init_Para.OCMode = OUTPUT_MODE_PWM1;
Tim_OC_Init_Para.OCIdleState = OUTPUT_IDLE_STATE_0;
Tim_OC_Init_Para.OCNIdleState = OUTPUT_IDLE_STATE_0;
Tim_OC_Init_Para.OCPolarity = OUTPUT_POL_ACTIVE_HIGH;
Tim_OC_Init_Para.OCNPolarity = OUTPUT_POL_ACTIVE_HIGH;
Tim_OC_Init_Para.OCFastMode = OUTPUT_FAST_MODE_DISABLE;
Tim_OC_Init_Para.Pulse = 0;
HAL_TIMER_Output_Config(TIM_Handler.Instance, &Tim_OC_Init_Para, TIM_CHANNEL_2);
TIM3_MSP_Post_Init();
DMA_TIM3_CC2_Init();
HAL_TIM_ENABLE_DMA(&TIM_Handler, TIMER_DMA_EN_CC2);
HAL_DMA_Start(TIM_Handler.hdma[TIM_DMA_CC2_INDEX], (UINT32)CCR2_Value, (UINT32)&TIM_Handler.Instance->CCR2, 3);
HAL_TIM_PWM_Output_Start(TIM_Handler.Instance, TIM_CHANNEL_2);
}
不断改变PWM参数的程序为:
void Timer_PWM_Output_DMA_Test(void)
{
TIM3_Init();
v=1;
while(1)
{
v=(v+1)%500;
TIM3_Init();
System_Delay_MS(10);
}
}
实现测试效果的主程序为:
int main(void)
{
System_Init();
Uart_Init();
Timer_PWM_Output_DMA_Test();
while(1)
{
}
}
经程序的编译与下载,其测试效果如视频所示。
演示视频:
[localvideo]dba18266f1a94d87a359da87a0561a88[/localvideo]
2.占空比检测
改检测的是以TIM1作定时器,由PA8输出100KHz的MCO信号作为TIM1定时器的输入信号,通过PC8来接入。通过定时器的输入捕获功来测输入信号的占空比。
占空比检测的函数内容为:
void Timer_PWM_Input_Test(void)
{
uint32_t timer_clock;
timer_clock = System_Get_APBClock();
if (System_Get_SystemClock() != System_Get_APBClock()) // if hclk/pclk != 1, then timer clk = pclk * 2
{
timer_clock = System_Get_APBClock() << 1;
}
TIM1_Init();
while(1)
{
TIM1_PWM_Input_Test(timer_clock);
HAL_TIM_Capture_Stop(TIM_Handler.Instance, TIM_CHANNEL_1);
HAL_TIM_Capture_Stop(TIM_Handler.Instance, TIM_CHANNEL_2);
HAL_TIMER_Clear_Capture_Flag(&TIM_Handler, TIM_CHANNEL_1);
HAL_TIMER_Clear_Capture_Flag(&TIM_Handler, TIM_CHANNEL_2);
System_Delay_MS(1000);
}
}
实现测试的主程序为:
int main(void)
{
System_Init();
Uart_Init();
System_Set_Buzzer_Divider( (System_Get_SystemClock()/BUZZER_OUTPUT_FREQ) - 1, FUNC_ENABLE);
System_Delay(1000);
Timer_PWM_Input_Test();
while(1)
{
}
}
经程序的编译与下载,其测试效果如图2和图3所示。
其中,图2是在用导线连接PA8和PC8的情况下,其占空比是稳定在50%。
图2 稳定的占空比
图3的检测则比较随意,即以手指随意地划过PC8引脚,则会产生不同的占空比。
图3 随机测试
-
回复了主题帖:
【航芯ACM32F403开发板测评】+A/D数据采集及程序分析
lugl4313820 发表于 2025-3-7 10:42
老师从各种角度都对ADC的驱动,实际串口输出进行了分享,很有借鉴意义,感谢分享优质作品!
感谢支持,进行与大家进行分享。
- 2025-03-06
-
发表了主题帖:
【航芯ACM32F403开发板测评】+A/D数据采集及程序分析
在ACM32F403芯片内,集成了一个多通道的 12 位高精度ADC,其采集速度可达2M sps。
对于A/D数据采集,厂家提供了具用多种工作模式的Demo程序以供用户学习和验证。
以ADC_Test(TEST_POLLING_NCHANNELS)测试为例,其测试结果图1和图2所示。
图1 串口通讯就绪
图2 A/D数据采集
即每按下一次板上的用户键,就输出一轮多通道的数据采集值,其程序如下:
void ADC_Test_Polling_Nchannels(void)
{
uint32_t i, VrefP, Voltage;
uint32_t lu32_COM_OK = 0;
printfS("The ADC test ADC_Test_Polling_Nchannels start.");
VrefP = ADC_GetVrefP(ADC_CHANNEL_8);
printfS("The VrefP value is : %d \r\n", VrefP);
UserKEY_Init();
printfS("---------- Please press the USR_PB button ----------\r\n");
ADC_Init_Polling_Nchannels();
while(1)
{
while(false == UserKEY_Get());
System_Delay_MS(500);
for (i = 0; i < BUFFER_LENGTH; i++)
{
gu32_AdcBuffer[i] = 0;
}
HAL_ADC_Polling(&ADC_Handle, gu32_AdcBuffer, ADC_Handle.ChannelNum, 0);
for (i = 0; i < ADC_Handle.ChannelNum; i++)
{
printfS("The adc convert result : Channel %d = 0x%08x. ", gu32_AdcBuffer[i]>>16 & 0xFF,gu32_AdcBuffer[i]);
Voltage = (gu32_AdcBuffer[i]&0xFFF)*VrefP/4095;
printfS("The Voltage is: %d mV \r\n", Voltage);
lu32_COM_OK++;
}
printfS("ADC Test OK count %d times \r\n", lu32_COM_OK);
}
}
通过仔细观察,会发现这里少了对通道 ADC_CHANNEL_3 和ADC_CHANNEL_11的采集,这是为什么呢?
原来 ADC_CHANNEL_3所使用的引脚是PA2,而ADC_CHANNEL_11所使用的引脚是PA3。
而串口2的TX2所用的引脚正是PA2,RX2所用的引脚则是PA3,为此要使用串口2来输出信息,就必须回避对这2个引脚的使用。
当然,若使用串口1来输出信息是可以避开这个问题,但使用串口1就不能通过调试口来观察信息了,必须外接USB转TTL模块来进行串行通讯。
那为什么采集的通道顺序不是按自然的由小到大顺序呢?
原来这是与其初始化程序的编排有关,其内容为:
void ADC_Init_Polling_Nchannels(void)
{
ADC_ChannelConfTypeDef ADC_ChannelConf;
ADC_Handle.Init.ClockDiv = ADC_CLOCK_DIV8;
ADC_Handle.Init.ConConvMode = ADC_CONCONVMODE_DISABLE;
ADC_Handle.Init.JChannelMode = ADC_JCHANNELMODE_DISABLE;
ADC_Handle.Init.DiffMode = ADC_DIFFMODE_DISABLE;
ADC_Handle.Init.DMAMode = ADC_DMAMODE_DISABLE;
ADC_Handle.Init.OverMode = ADC_OVERMODE_DISABLE;
ADC_Handle.Init.OverSampMode = ADC_OVERSAMPMODE_DISABLE;
ADC_Handle.Init.AnalogWDGEn = ADC_ANALOGWDGEN_DISABLE;
ADC_Handle.Init.ExTrigMode.ExTrigSel = ADC_SOFTWARE_START;
ADC_Handle.Init.ChannelEn = ADC_CHANNEL_0_EN | ADC_CHANNEL_1_EN | ADC_CHANNEL_2_EN | \
ADC_CHANNEL_4_EN | ADC_CHANNEL_5_EN | ADC_CHANNEL_6_EN | ADC_CHANNEL_7_EN | \
ADC_CHANNEL_8_EN | ADC_CHANNEL_9_EN | ADC_CHANNEL_10_EN | \
ADC_CHANNEL_12_EN | ADC_CHANNEL_13_EN | ADC_CHANNEL_14_EN | ADC_CHANNEL_15_EN;
ADC_Handle.Instance = ADC;
HAL_ADC_Init(&ADC_Handle);
/* The total adc regular channels number */
ADC_Handle.ChannelNum = 14;
/* Add adc channels */
ADC_ChannelConf.Channel = ADC_CHANNEL_0;
ADC_ChannelConf.RjMode = 0;
ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ1;
ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
ADC_ChannelConf.Channel = ADC_CHANNEL_15;
ADC_ChannelConf.RjMode = 0;
ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ2;
ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
ADC_ChannelConf.Channel = ADC_CHANNEL_2;
ADC_ChannelConf.RjMode = 0;
ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ3;
ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
ADC_ChannelConf.Channel = ADC_CHANNEL_4;
ADC_ChannelConf.RjMode = 0;
ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ4;
ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
ADC_ChannelConf.Channel = ADC_CHANNEL_5;
ADC_ChannelConf.RjMode = 0;
ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ5;
ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
ADC_ChannelConf.Channel = ADC_CHANNEL_6;
ADC_ChannelConf.RjMode = 0;
ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ6;
ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
ADC_ChannelConf.Channel = ADC_CHANNEL_7;
ADC_ChannelConf.RjMode = 0;
ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ7;
ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
ADC_ChannelConf.Channel = ADC_CHANNEL_8;
ADC_ChannelConf.RjMode = 0;
ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ8;
ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
ADC_ChannelConf.Channel = ADC_CHANNEL_9;
ADC_ChannelConf.RjMode = 0;
ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ9;
ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
ADC_ChannelConf.Channel = ADC_CHANNEL_10;
ADC_ChannelConf.RjMode = 0;
ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ10;
ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
ADC_ChannelConf.Channel = ADC_CHANNEL_12;
ADC_ChannelConf.RjMode = 0;
ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ11;
ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
ADC_ChannelConf.Channel = ADC_CHANNEL_13;
ADC_ChannelConf.RjMode = 0;
ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ12;
ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
ADC_ChannelConf.Channel = ADC_CHANNEL_14;
ADC_ChannelConf.RjMode = 0;
ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ13;
ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
ADC_ChannelConf.Channel = ADC_CHANNEL_1;
ADC_ChannelConf.RjMode = 0;
ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ14;
ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;
HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);
}
这样我们在看如下的主程序,就清晰了很多。
int main(void)
{
System_Init();
Uart_Init();
ADC_Test(TEST_POLLING_NCHANNELS);
while(1)
{
}
}
此外,在此基础上我们还以随意地裁剪采集的通道数量,乃至只采集需要的指定通道。
只采集通道0和通道15的结果如图3所示,连续对通道1进行数据采集的结果如图4所示。
图3 双通道采集
图4 单通道连续采集
- 2025-03-05
-
回复了主题帖:
【航芯ACM32F403开发板测评】+RTC与电子时钟
lugl4313820 发表于 2025-3-5 07:29
好强大的OLED,感谢大佬分享时钟模块,老师的数据线看起来非常特别呀!
这种接头的方式比较皮实,不易损坏。
-
回复了主题帖:
【航芯ACM32F403开发板测评】+RTC与电子时钟
eew_Eu6WaC 发表于 2025-3-5 08:01
好简洁的代码,看着使用非常方便,内置RTC精确度高嘛?
在没有高精度检测设备的情况下,其精度在日常应用中应该没问题。
-
发表了主题帖:
【航芯ACM32F403开发板测评】+RTC与电子时钟
本帖最后由 jinglixixi 于 2025-3-5 11:10 编辑
ACM32F403配有内置得RTC计时器,可以方便地实现日历功能,将它与前面得OLED屏相结合就可实现电子时钟得显示功能。
为实现数值的显示,需添加数值显示函数,其内容为:
void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size2)
{
uint8_t t,temp;
uint8_t enshow=0;
for(t=0;t<len;t++)
{
temp=(num/oled_pow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
continue;
}
else
enshow=1;
}
OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
}
}
要使用RTC的计时功能,需对其进行配置和初始化,其内容为:
RTC_Handle.u32_ClockSource = RTC_CLOCK_XTL;
RTC_Handle.u32_Compensation = COMPENSATION_INCREASE;
RTC_Handle.u32_CompensationValue = 0x05;
HAL_RTC_Config(&RTC_Handle);
/* Set RTC Time¡¢Date */
gstr_Time_Set.u8_Hours = 0x12;
gstr_Time_Set.u8_Minutes = 0x30;
gstr_Time_Set.u8_Seconds = 0x00;
HAL_RTC_SetTime(&gstr_Time_Set);
gstr_Date_Set.u8_Year = 0x25;
gstr_Date_Set.u8_Month = RTC_MONTH_MARCH;
gstr_Date_Set.u8_Date = 0x6;
gstr_Date_Set.u8_WeekDay = RTC_WEEKDAY_FRIDAY;
HAL_RTC_SetDate(&gstr_Date_Set);
实现电子时钟显示功能的测试主程序为:
int main(void)
{
System_Init();
Uart_Init(115200);
Oled_Config();
OLED_Init();
OLED_Clear();
OLED_ShowString(10,0,"ACM32F403",16);
OLED_ShowString(10,2,"0.96 OLED",16);
OLED_ShowString(10,4," : :",16);
APP_RTC_Test();
while (1)
{
HAL_RTC_GetTime(&gstr_Time_Get);
HAL_RTC_GetDate(&gstr_Date_Get);
HAL_RTC_GetTime(&gstr_Time_Get_Again);
if (gstr_Time_Get.u8_Seconds != gstr_Time_Get_Again.u8_Seconds)
{
continue;
}
if (fu32_Seconds != gstr_Time_Get.u8_Seconds)
{
fu32_Seconds = gstr_Time_Get.u8_Seconds;
s=gstr_Time_Get.u8_Hours;
s=s/16*10+s%16;
OLED_ShowNum(10,4,s,2,16);
s=gstr_Time_Get.u8_Minutes;
s=s/16*10+s%16;
OLED_ShowNum(34,4,s,2,16);
s=gstr_Time_Get.u8_Seconds;
s=s/16*10+s%16;
OLED_ShowNum(58,4,s,2,16);
}
}
}
经程序的编译和下载,其显示效果如图所示。
计时效果图
- 2025-03-04
-
回复了主题帖:
【泰坦触觉 TITAN Core开发套件】开发技术探索与期待
本帖最后由 jinglixixi 于 2025-3-4 21:43 编辑
秦天qintian0303 发表于 2025-3-4 10:23 一开始我想用Adafruit ESP32-S3 Reverse TFT Feather着,用cpy开发,结果没有对应的心跳检测的驱动库,只 ...
这个M5stack挺不错的,查到价格了值得拥有!
- 2025-03-03
-
回复了主题帖:
【泰坦触觉 TITAN Core开发套件】开发技术探索与期待
okhxyyo 发表于 2025-3-3 13:33
已经反馈过去了哈,有进展了给大家说哈
感谢!!!