在Keil软件让STM32单片机实现Arduino的miliis()毫秒运行时间函数

用惯了arduino的时间函数,用keil后发现没有类似函数。自己写了一个试验了下。毫秒级还是很顺畅的,实现微秒的话会卡顿,希望有高人指点可以优化实现微秒micros()函数。
STM32F10x_CONF.H记得要加入这个 #include “stm32f10x_tim.h”
代码如下:

double  millis(void)
	{
		return T;
}
/*******************************************************************************
* Function Name  : TIM2_IRQHandler
* Description    : This function handles TIM2 Handler.
*******************************************************************************/
void TIM2_IRQHandler(void)
{
    static uint8_t display;
	T++;
	if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET ) 
	{
		TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
   
     }	
}
/*******************************************************************************
* Function Name  : TIM_Configuration
* Description    : TIM_Configuration program.
*******************************************************************************/
void TIM_Configuration(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
  TIM_DeInit(TIM2);
  TIM_TimeBaseStructure.TIM_Period=1;			/* 1毫秒自动重装载寄存器周期的值(计数值) */
																	/* 累计 TIM_Period个频率后产生一个更新或者中断 */
  TIM_TimeBaseStructure.TIM_Prescaler= (36000 - 1);				    /* 时钟预分频数   例如:时钟频率=72MHZ/(时钟预分频+1) */
  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV2; 			/* 采样分频 */
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 		/* 向上计数模式 */
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);							    /* 清除溢出中断标志 */
  TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
  TIM_Cmd(TIM2, ENABLE);											/* 开启时钟 */
}

/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configuration the nested vectored interrupt controller.
*******************************************************************************/
void NVIC_Configuration2(void)
{
  NVIC_InitTypeDef NVIC_InitStructure; 
	 
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  													
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;	  
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

main.c运行代码:

#include "stm32f10x.h"
#include "delay.h"
#include "Lcd_Driver.h"
#include "GUI.h"
int main(void)
{
	char text[20];
		NVIC_Configuration2();
	TIM_Configuration();

  delay_init(72);//Delay init.
	
	Lcd_Init();
	LCD_LED_SET;//通过IO控制背光亮	
	Lcd_Clear(BLACK);
	
 while(1)
  {  

		sprintf(text,"%20.3f",millis()/1000);
	  Gui_DrawFont_GBK24(16,30,RED,GRAY0,text);
	  delay_ms(100);
  }

}

例程代码放在资源链接里面了。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
解耦控制器是一种常用的控制器设计方法,可以将多输入多输出系统分解为多个互相独立的单输入单输出系统进行控制,从而简化系统的控制问题。 在 keil 软件实现解耦控制器需要进行以下步骤: 1. 定义控制系统的状态空间模型,包括状态变量、输入变量和输出变量。 2. 根据系统的状态空间模型,设计解耦控制器的状态反馈矩阵和输出反馈矩阵。 3. 将状态反馈矩阵和输出反馈矩阵转换为 keil 软件中的矩阵形式。 4. 在 keil 软件中编写控制程序,包括状态观测器、状态反馈控制器和输出反馈控制器等模块。 5. 将程序下载到 stm32 单片机上,并进行实验验证。 具体实现过程可以参考以下代码: ```c #include <stm32f10x.h> #include <math.h> #define PI 3.1415926 /* 定义状态变量 */ float x[2] = {0.0f, 0.0f}; float y[2] = {0.0f, 0.0f}; /* 定义输入变量 */ float u[2] = {0.0f, 0.0f}; /* 定义输出变量 */ float y1 = 0.0f; float y2 = 0.0f; /* 定义状态反馈矩阵 */ float K[2][2] = {{0.0f, 0.0f}, {0.0f, 0.0f}}; /* 定义输出反馈矩阵 */ float L[2] = {0.0f, 0.0f}; /* 定义控制器参数 */ float alpha = 0.5f; float beta = 0.5f; /* 定义控制器周期 */ float T = 0.01f; /* 定义控制器输入 */ float r1 = 0.0f; float r2 = 0.0f; /* 状态观测器 */ void state_observer(float y1, float y2, float u1, float u2) { x[0] = alpha * x[0] + beta * (y1 - L[0] * x[1] - L[1] * y2 + K[0][0] * u1 + K[0][1] * u2); x[1] = alpha * x[1] + beta * (y2 - L[1] * x[0] - L[0] * y1 + K[1][0] * u1 + K[1][1] * u2); } /* 状态反馈控制器 */ void state_feedback_controller(float r1, float r2) { u[0] = -K[0][0] * x[0] - K[0][1] * x[1] + r1; u[1] = -K[1][0] * x[0] - K[1][1] * x[1] + r2; } /* 输出反馈控制器 */ void output_feedback_controller(float y1, float y2) { y1 = L[0] * x[0] + L[1] * x[1]; y2 = L[1] * x[0] + L[0] * x[1]; } int main(void) { /* 初始化控制器 */ K[0][0] = 1.0f; K[0][1] = 0.0f; K[1][0] = 0.0f; K[1][1] = 1.0f; L[0] = 1.0f; L[1] = 1.0f; /* 循环控制 */ while(1) { /* 获取控制器输入 */ r1 = sin(2 * PI * T); r2 = cos(2 * PI * T); /* 获取控制器输出 */ output_feedback_controller(y1, y2); /* 获取系统状态 */ state_observer(y1, y2, u[0], u[1]); /* 进行状态反馈控制 */ state_feedback_controller(r1, r2); /* 延时控制器周期 */ for(uint32_t i=0; i<10000; i++); } } ``` 注意:以上代码仅为示例代码,实际应用中需要根据具体系统进行修改和优化,以满足系统要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值