铁头山羊平衡车---电机调速(1)

首先进行STBY的代码编写,需要实现的功能:待机/休眠。

同时,这个STBY还控制两颗LED。这个STBY用的是按钮,涉及到按钮需要用到button.c和button.h,同时用到裸机多任务模型。

逻辑多任务模型:

按钮代码和连线位置如下:

#include "app_button.h"
#include "button.h"
#include "app_pwm.h"

static Button_TypeDef userKey;  //用户按钮

static void OnUserKey_Clicked(uint8_t clicks);

//
//简介:按钮初始化
//
void App_Button_Init(void)
{
    Button_InitTypeDef Button_InitStructure = {0};
    
    Button_InitStructure.GPIOx = GPIOA;
    Button_InitStructure.GPIO_Pin = GPIO_Pin_11;

    My_Button_Init(&userKey,&Button_InitStructure);

    My_Button_SetClickCb(&userKey,OnUserKey_Clicked);
}

void App_Button_Proc(void)
{
    My_Button_Proc(&userKey);
}

//
//简介:0-电机休眠 1-电机工作
//
static uint8_t pwm_on = 0;

//
//简介:按钮点击的回调函数
//
static void OnUserKey_Clicked(uint8_t clicks)
{
   if(clicks == 1)
   {
      //翻转状态
       if(pwm_on == 0)
       {
           pwm_on = 1;
       }
       else
       {
           pwm_on = 0;
       }
       
       App_PWM_Cmd(pwm_on);
   }
}

按钮写完之后是写STBY的控制函数

电路图在上面,在这个代码里需要实现的是电机的休眠/工作,同时LED的亮灭。

void STBY_Pin_Init(void)是一个简单的GPIO初始化,对应的口也都在电路图里可以看到,这里的代码写在App_PWM.c里,是对电机的代码。

//
//简介:控制TB6612的状态,会在外部App_Button.c被调用
//
void App_PWM_Cmd(uint8_t on)
{
   if(on == 0)
   {
        GPIO_Wrtite(GPIOA,GPIO_Pin_1,Bit_RESET);
   }
   else
   {
        GPIO_Wrtite(GPIOA,GPIO_Pin_1,Bit_SET);
   }
}

两颗LED可以看电路图,给STBY写1的时候,它是会自己亮的。

由于没有实际的参考引用内容,以下是基于一般情况对铁头山羊平衡使用RTOS(实时操作系统)的分析: 在平衡这类需要实时响应控制的设备中,RTOS能发挥重要作用。RTOS具有实时性、多任务处理等特性,可确保平衡在运行过程中对各种传感器数据(如陀螺仪、加速度计等)进行快速处理和响应,以维持身的平衡。 例如,RTOS可以创建多个任务,一个任务负责读取传感器数据,另一个任务根据读取的数据计算出合适的电机控制信号,还有任务负责与用户的交互设备(如蓝牙模块等)进行通信。 以FreeRTOS为例,在铁头山羊平衡中可能的代码示例如下: ```c #include "FreeRTOS.h" #include "task.h" #include "queue.h" // 定义传感器数据结构体 typedef struct { float gyro_x; float gyro_y; float accel_x; float accel_y; } SensorData; // 传感器数据读取任务 void vSensorReadTask( void *pvParameters ) { SensorData data; QueueHandle_t xQueue = (QueueHandle_t) pvParameters; for( ;; ) { // 模拟读取传感器数据 data.gyro_x = 0.1; data.gyro_y = 0.2; data.accel_x = 0.3; data.accel_y = 0.4; // 将数据发送到队列 xQueueSend( xQueue, &data, portMAX_DELAY ); // 任务延时 vTaskDelay( pdMS_TO_TICKS( 10 ) ); } } // 电机控制任务 void vMotorControlTask( void *pvParameters ) { SensorData data; QueueHandle_t xQueue = (QueueHandle_t) pvParameters; for( ;; ) { // 从队列接收传感器数据 if( xQueueReceive( xQueue, &data, portMAX_DELAY ) == pdPASS ) { // 根据数据计算电机控制信号 // 这里只是示例,实际需要复杂的算法 int motor_speed = (int)(data.gyro_x * 100); // 控制电机 // 这里只是示例,实际需要硬件驱动代码 } } } int main( void ) { QueueHandle_t xQueue; // 创建队列 xQueue = xQueueCreate( 5, sizeof( SensorData ) ); if( xQueue != NULL ) { // 创建任务 xTaskCreate( vSensorReadTask, "SensorRead", configMINIMAL_STACK_SIZE, (void *) xQueue, 1, NULL ); xTaskCreate( vMotorControlTask, "MotorControl", configMINIMAL_STACK_SIZE, (void *) xQueue, 2, NULL ); // 启动调度器 vTaskStartScheduler(); } for( ;; ); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值