智能机器人电控部分实现备忘录

第一章

环境:STM32F429IGXX,HAL库,MD36N减速直流有刷电机,FreeRTOS操作系统

          四线两相步进电机,EMWIN

一、电机的双路PWM控制正反转调速方式:

        1.ENA接PWM输出,IN1与IN2接入高低电平。TIM_OCMODE_PWM2有效。

        2.ENA接入高低电平,IN1与IN2接双路PWM输出或互补PWM输出

        注:双路相同配置的PWM分别输出到IN1、IN2时,当IN1使能PWM输出时,IN2必须关闭PWM使能,因为IN1与IN2必须输出电平相反电机才会转动。

        注:双路相反配置的PWM分别输出到IN1、IN2,必须同时使能,或同时stop。

通道1->TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;

通道2->TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM2;

        调速方式:CCR寄存器      调速效果为[-MAX,0,+MAX]

TIM1_SetPWM_pulse(TIM_CHANNEL_3,dutyfactor);//
TIM1_SetPWM_pulse(TIM_CHANNEL_4,6000-dutyfactor);//6000为定时器period,自定义
TIM_TimeBaseStructure.Init.Period = 6000 - 1;

二、strtok函数返回值调用

char* data_sick[36][7]={0};
char *p0;
char *p1;
char *p2;

char *buf;
buf = (char*)TEMP_USART3_RX_BUF;
p0 = strtok(buf,"#");
p1 = strtok(NULL, "#");
p2 = strtok(NULL, "#");

data_sick[1][0]=p0;
data_sick[1][1]=p1;
data_sick[1][2]=p2;
char str0[10];
char str1[10];
char str2[10];
sprintf(str0,"%s",p0); 
sprintf(str1,"%s",p1); 
sprintf(str2,"%s",p2); 

        vTaskResume函数;//任务从挂起态->就绪态

三、串口发送一个字节数据

void sendByte(USART_TypeDef *USARTx, uint8_t byte)
{
	USARTx->DR=byte;  
    while((USARTx->SR&0X40)==0);			//循环发送,直到发送完毕 
}
//USARTx->DR=byte;与while((USARTx->SR&0X40)==0);顺序颠倒后,有时发送的数据起始位置出现乱码。
void sendString(USART_TypeDef *USARTx, char *str)
{
    while (*str)
    {
        sendByte(USARTx,*str++);
    }
}

四、stm32HAL库串口的空闲中断与接收中断

        未完待续...

五、stm32实现带usb触摸功能的VGA显示屏

        未完待续...

六、usb工业摄像头的stm32实现

        未完待续...

七、四线两相步进电机的stm32实现启停,角度精确控制

        未完待续...

问题1:回调函数进不去

TIM_EncoderHandle.Init.Period = 1000;

//不可为0,开启的中断源与回调函数相对应更新中断使能需要在主函数循环中

问题2:AB相脉冲始终为0

检查GPIO的输入输出Mode

问题3:Error: L6218E: Undefined symbol HAL_SD_Get_CardInfo (referred from sdcard.o).

没有添加对应的stm32库文件,可找正确例子,不断找源文件名称(F12),逐步添加至工程。

问题4:电机的使能端的GPIO设置,开漏输出,PWM输出模式为TIM_OCMODE_PWM2.改变之后无法控制电机。

问题5:串口中断发送数据给消息队列

        Error:..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,784

        Error:..\FreeRTOS\tasks.c,2808

问题6:hal库的程序一直卡在定时器中断服务函数出不来

问题7:串口中断与定时器中断与操作系统的优先级设定

问题8:定时器的TIM1_CH3N能否单独使用

问题9:delay函数卡死

        user文件夹中的配置文件出错,每一个不同功能的配置文件不尽相同,当移植到新工程后,如果出现错误,不能随意地将原来文件覆盖新工程下的同名文件,应优先解决报错的问题。

问题10:四线两相步进电机电机只响不转

        PWM波频率过低,亲测50000hz

	TIM_TimeBaseStructure.Init.Period = 200;
	// 通用控制定时器时钟源TIMxCLK = HCLK/2=90MHz  //HCLK(180MHz)
	// 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=10MHz
    // 一个PWM周期时间=Period/10MHz = 0.00002s,输出频率为1/0.00002=50kHz
	TIM_TimeBaseStructure.Init.Prescaler = 9-1;	

问题11:emwin点击button,界面会闪动

        答:与Touch函数里的延迟函数参数有关,适当调整即可,延迟过大,触摸响应缓慢,延迟过小,界面闪动

//触摸任务的任务函数
void touch_task(void *pvParameters)
{
	while(1)
	{
		GUI_TOUCH_Exec();	
		vTaskDelay(13);		//延时5ms
	}
}

问题12:RTC在emwin界面过3、4秒才刷新一次

问题13:汉字在keil里的存储与显示

char* data_sick[36][6];  //main函数外声明
data_sick[1][0] ="干扰素";  //函数内赋值

问题14:Freertos+EMWIN删除子任务task,EMWIN界面停止不动

        答:与EMWIN任务的TASK1_STK_SIZE有关,当TASK1_STK_SIZE过小时会出现这种情况

问题15:char*类型数据转整型数据

#include "stdlib.h"
int = atoi(char*);

问题16:FreeRTOS的任务与EMWIN,当EMWIN界面运行时,FreeRTOS任务执行,界面卡住

        答:一个原因在于FreeRTOS任务中消息队列使用不恰当,导致EMWIN界面卡住。

原本任务与EMWIN界面配合可以无误。

问题17:MULTIEDIT如何实现文本替换

限制大小+
MULTIEDIT_SetMaxLen(MULTIEDIT_Drug,5);  //大小貌似无影响

问题18:emwin的MULTIEDIT_AddText无法显示汉字

        MULTIEDIT_AddText所需显示的汉字必须是带'\0'结束符的字符串,需要将char*类型数据进行格式转换,示例代码:

char *p0;         
char str0[10];
sprintf(str0,"%s",p0); 

问题19:FreeRTOS系统中定时器中断失效

        答:在开启调度器时会初始化中断控制器,因此我们初始化中断控制器只能在任务调度之后进行,也就是在vTaskStartScheduler()开启任务调度之前,用户所用定时器中断,编码器中断等等均失效。而如果任务调度之前不进行中断初始化,那单片机的中断管理器无法接收到用户的配置信息。

处理办法:

int main(void)
{
    TIMx_Configuration();/* 初始化基本定时器,用于处理定时任务 */
	//创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄                
    vTaskStartScheduler();          //开启任务调度
}
//开始任务任务函数
void start_task(void *pvParameters)
{
    TIMx_Configuration();//此处需要再次调用中断初始化函数
    taskENTER_CRITICAL();           

    vTaskDelete(StartTask_Handler);
    taskEXIT_CRITICAL();            
}

根本原因所在

第二章

USB_HOST通信协议

以期用stm32驱动usb摄像头,带usb触摸功能的VGA显示屏,USB二维码扫描器

学习资料来自B站ST官方出品,STM USB培训视频

【ST官方出品】STM USB培训视频全集_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1yQ4y1k72c?p=2以下资料仅用于个人学习记录,如有建议,联系

USB IP作为全速USB设备

USB+IP作为全速USB设备

FS OTG IP 可用于全速与低速USB主机 ,可作为全速USB设备

HS OTG IP 可用于全速、高速、低速USB主机 ,可作为高速与全速USB设备

OTG IP library:(stm32_f105-07_f2_f4_usb-host-device_Lib.zip)

设备例程:AUDIO(音频),DFU(升级固件),HID(人机接口),MSC(大容量存储),VCP(串口)

Dual Core:FS IP与 HS IP同时工作,分别实现MSC与HID设备

主机例程:MSC(大容量存储),HID(人机接口)

Dual Core:FS IP与 HS IP同时工作,分别实现MSC与HID主机

USB+IP library:只能做设备(stsw-stm32092.zip)

- Audio_speaker(音频、扬声器)、CCID(智能卡)、Msc(U盘)
. custom_HID(用户定制HID例程)、HID、HID_LPM_test.   (鼠标键盘模拟)

DFU.     Virtual_COM_Port
.CDC+HID复合设备、MSC+HID复合设备
USB IP library:只能做设备(stsw-stm32081.zip)

- Audio_Speaker、DFU、Msc. Joystick、Custom_HID、 VCP.

MSC+HID复合设备

智能机器人电控部分实现备忘录_第1张图片

 Packet:SOP(start of packet),SYNC(同步信号), Packet Content(数据包内容),EOP(end of packet)

Packet Content:PID,地址,帧号,数据,CRC

        PID:数据包的ID号即类型

                命令(Token) Packet
                帧首(Start of Frame) Packet

                数据(Data) Packet
                握手(Handshake) Packet

第三章

环境 RT-Thread操作系统, STM32F103开发板

 一、RT-Thread Studio配置普中TFT3.5寸彩屏(基于STM32F103ZET6)

链接:https://pan.baidu.com/s/1FkglQi7ppKMSUMOJhesllg?pwd=tlnn 

第一步:建立RT-Thread工程,同时添加上述网盘中的LCD相关文件,如图(delay文件夹可无)

智能机器人电控部分实现备忘录_第2张图片

 第二步:cubemax配置FSMC及BL引脚

普中PZ6806L单片机的BL引脚为PE0、PE1,output,pull-up

智能机器人电控部分实现备忘录_第3张图片智能机器人电控部分实现备忘录_第4张图片

 智能机器人电控部分实现备忘录_第5张图片

 智能机器人电控部分实现备忘录_第6张图片

 智能机器人电控部分实现备忘录_第7张图片

智能机器人电控部分实现备忘录_第8张图片

 cubemax文件夹里SConscript增加c文件,同步scons配置至项目智能机器人电控部分实现备忘录_第9张图片

第三步:RT-Thread配置

mian.c文件

#include 
#include "tftlcd.h"
#include "delay.h"
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include 
#include "usart.h"
#include "gpio.h"
#include "fsmc.h"
int main(void)
{
    int count = 1;
    HAL_Init();
    MX_GPIO_Init();
    MX_FSMC_Init();
    MX_USART1_UART_Init();
    TFTLCD_Init();
    delay_init(72);
    LCD_ShowString(0, 0, 120, 20, 24, (uint8_t*)"hello");
    while (count++)
    {
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}

右键工程名称,点击构建配置,加入lcd等文件路径

添加--工作空间--选择文件夹--确定--...--应用并关闭

智能机器人电控部分实现备忘录_第10张图片

 注释这三句错误代码智能机器人电控部分实现备忘录_第11张图片 

二、ESP8266通过串口调试助手发送指令连接云平台(onenet,mqtt)注意命令后的回车

        AT//测试模块是否能正常通讯,返回"ok"即为正常
        AT+CWMODE=3//配置成 AT+STA模式
        AT+RST//重启生效

                        输出结果中有固件烧录参数

                        SPI Speed : 40MHz
                        SPI Mode : DOUT
                        SPI Flash Size & Map: 32Mbit(1024KB+1024KB)
        AT+CIFSR//查询设备IP

        以下两条指令仅支持部分固件

  AT+CWJAP=ssid,password
  AT+IOTCFG=devid,proid,auth_info         

        devid 为设备DI,proid 为产品ID,auth_info为鉴权信息

 三、RT-Thread studio ESP8266 onenet mqtt 完整步骤

1.ESP8266硬件配置

智能机器人电控部分实现备忘录_第12张图片

        烧录软件(若esp8266如上图,里面参数不用变,只需更改bin文件位置)及固件打包网盘:

        链接:https://pan.baidu.com/s/1kNDMtYTZlTsopiOrqU0ETA?pwd=alat 
        提取码:alat

2.模式配置

        AT+CWMODE=3//配置成 AT+STA模式
        AT+RST//重启生效

3.RT-Thread studio加入ESP8266与onenet的程序包(网上都有教程)

4.操作无误的话,ESP8266只会自动连接wifi,需要手动在串口调试助手里执行

        onenet_mqtt_init指令,这样就可以连接到onenet云平台了。

5.需要传输数据,详情请看B站视频

http://【RT-Thread Studio】 https://www.bilibili.com/video/BV1dZ4y1b7WW?p=3&share_source=copy_web&vd_source=9208177a34ecb3f31472feb836f44ba6

问题1:RT-Thread添加已有程序时会出现uint8_t uint16_t  uint32_t size_t未定义

        https://pan.baidu.com/s/1FkglQi7ppKMSUMOJhesllg?pwd=tlnn 

        将连接里的sys.h文件包含即可。

问题2:fatal error: stdef.h: No such file or directory

        网上有很多错误,正确的是:#include

问题3:Read response buffer failed. The Response buffer size is out of buffer size(128)!

智能机器人电控部分实现备忘录_第13张图片

 修改响应最大支持的接收数据的长度为128,防止缓冲区内存过小

resp = at_create_resp(128, 0, rt_tick_from_millisecond(300));

at.Client.c位置:RT-ThreadStudio\workspace\test\rt-thread\components\net\at\src

另一种办法:

https://blog.csdn.net/zhjmyx/article/details/120869130https://blog.csdn.net/zhjmyx/article/details/120869130

问题4:could not stop cortex-m device

在这里插入图片描述

 一种出现情况:如果单片机串口下载部分损坏,当仅用USB-TTL模块与STlink下载器时;

解决办法:未知原因,可以只用usb串口下载接口给单片机供电,另一个USB-TTL接口与ST-Llink换着用,切记,不可USB-TTL接口与单片机圆头供电口一起用(串口下载接口损坏,充电口异常情况下)电脑会黑屏

你可能感兴趣的:(STM32,c语言,stm32,单片机,嵌入式硬件,arm)