当前位置: 首页 > news >正文

wordpress版主长春网站优化咨询

wordpress版主,长春网站优化咨询,太仓做企业网站,wordpress演示系列文章目录 文章目录 系列文章目录前言一、端口处理二、在Encoder中引入新的类型1.增加485类型2.增加串口的初始化操作3.数据处理 总结 前言 尝试在ODrive中添加485型的编码器的支持 一、端口处理 计划使用PA2及PA3作为485通信的端口。这样首先要把外部温度传感器的I/O口给…

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、端口处理
  • 二、在Encoder中引入新的类型
    • 1.增加485类型
    • 2.增加串口的初始化操作
    • 3.数据处理
  • 总结


前言

尝试在ODrive中添加485型的编码器的支持


一、端口处理

计划使用PA2及PA3作为485通信的端口。这样首先要把外部温度传感器的I/O口给改掉。
找到外部温度传感器配置初始化的地方改掉,改成GPIO5,也就是PC4。

class OffboardThermistorCurrentLimiter : public ThermistorCurrentLimiter, public ODriveIntf::OffboardThermistorCurrentLimiterIntf {
public:static const size_t num_coeffs_ = 4;struct Config_t {float thermistor_poly_coeffs[num_coeffs_];//0716 Change GPIO PIN TO 5  PC4
#if HW_VERSION_MAJOR == 3//uint16_t gpio_pin = 4;uint16_t gpio_pin = 5;
#elif HW_VERSION_MAJOR == 4uint16_t gpio_pin = 2;
#endif

串口2 默认打开配置

            case ODriveIntf::GPIO_MODE_UART_B: {GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = (i == 0) ? GPIO_PULLDOWN : GPIO_PULLUP; // this is probably swapped but imitates old behaviorGPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;//if (!odrv.config_.enable_uart_b) {odrv.misconfigured_ = true;// }

此外还需要进行I/O的配置,485使用串口的配置。如果想保持原风格的话,需要添加对应枚举类型,在原有的初始化硬件体系下进行。也可以自己定义一个I/O及外设初始化的函数,在所有外设初始化完成以后调用。

二、在Encoder中引入新的类型

1.增加485类型

Encoder的类型是工程通过Odrive-interface.yaml生成的。包括其他的一些枚举类型,所以从工程里直接去链接类型定义是找不到的。

ODrive.Encoder.Mode:values:INCREMENTAL:HALL:SINCOS:SPI_ABS_CUI:value: 0x100doc: Compatible with CUI AMT23xxSPI_ABS_AMS:value: 0x101doc: Compatible with AMS AS5047P, AS5048A/AS5048B (no daisy chain support)SPI_ABS_AEAT:value: 0x102doc: Supports AEAT-8800SPI_ABS_RLS:value: 0x103doc: Supports RLS Orbis EncodersSPI_ABS_MA732:value: 0x104doc: MagAlpha MA732 magnetic encoderU485_SRMA34:value: 0x400doc: SRMA34-M16S17Bit-SY-C-5V encoder

这里增加一个U485_SRMA34的类型,注意开头不要数字开头,编译会有错误。

class Encoder : public ODriveIntf::EncoderIntf {
public:static constexpr uint32_t MODE_FLAG_ABS = 0x100;// 0717static constexpr uint32_t MODE_FLAG_SRMA = 1024;static constexpr std::array<float, 6> hall_edge_defaults = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f};struct Config_t {//0717 Mode mode = MODE_U485_SRMA34; //Mode mode = MODE_INCREMENTAL;

在Encoder类型中,把对应的编码器类型给修改一下。

2.增加串口的初始化操作

这部分可以从系统串口初始化那边扒下来,直接启用串口2。
但是0.5.6版本不支持双串口同时使用,所以不能直接在odrive_main.h中启用uart_b。
所以还是再重新定义一个新的变量和新的处理任务。
这样的话永远不要再用原来的使能来启用uart_b了。

UART_HandleTypeDef* uart_a = &huart4;
UART_HandleTypeDef* uart_b = &huart2; // TODO: this could be supported in ODrive v3.6 (or similar) using STM32's USART2
UART_HandleTypeDef* uart_c = nullptr;
UART_HandleTypeDef* uart_485_a = &huart2; // TODO: this could be supported in ODrive v3.6 (or similar) using STM32's USART2struct BoardConfig_t {ODriveIntf::GpioMode gpio_modes[GPIO_COUNT] = {DEFAULT_GPIO_MODES};bool enable_uart_a = true;bool enable_uart_b = false;bool enable_uart_c = false;bool enable_uart_485_a = true;uint32_t uart_485_a_baudrate = 115200;uint32_t uart_a_baudrate = 115200;uint32_t uart_b_baudrate = 115200;uint32_t uart_c_baudrate = 115200;

做戏也做全套,新增一个uart_485_a的变量,也指向huart2。这样后面不再引用uart_b的变量了。
在 boardInit里面增加初始化操作

    //0717if (odrv.config_.enable_uart_485_a) {uart_485_a->Init.BaudRate = odrv.config_.uart_485_a_baudrate;MX_USART2_UART_Init();}

当然这样只是初始化完成了外设。还需要把数据处理和数据关联加上。

波特率根据自己用的编码器外设来配置哦。

3.数据处理

在对应的头文件中,添加这些接口的说明。

在main函数的inti_communication函数中,调用此函数。

void init_communication(void) {//printf("hi!\r\n");// Dual UART operation not supported yetif (odrv.config_.enable_uart_a && odrv.config_.enable_uart_b) {odrv.misconfigured_ = true;}if (odrv.config_.enable_uart_a && uart_a) {start_uart_server(uart_a);} else if (odrv.config_.enable_uart_b && uart_b) {start_uart_server(uart_b);}// 0903 start 485 data handleif (odrv.config_.enable_uart_485_a && uart_485_a) {start_u485_server(uart_485_a);}

之后我们再完善 这个处理数据的任务。先进入到编码器定时采集的接口,sample_now,添加上我们的485编码器类别,。
获取数据的方式还是用DMA的方式,在回调中处理数据到相应的变量。
试了几种方法都不太行,不知道是不是HAL库内部配置的太多了。这样倒是也省了一些额外的任务开支。

        case MODE_U485_SRMA34:{// Send 485 order to Encoder// Send 485 order to Encoder 0912get_gpio(6).write(true);HAL_UART_AbortReceive(&huart2);HAL_UART_Receive_DMA(&huart2, u485_rx_buffer, 6);ucTemp = 0x02;HAL_UART_Transmit(&huart2, &ucTemp, 1, 10);get_gpio(6).write(false);}break;

再来回想一下,SPI类型的编码器的处理,在其回调中得到一个位置的绝对值,并传递给pos_abs_参数。
数据的处理,可以放到Task任务中去,结合串口中断来实现。
所以直接在Update中来继续剩下的部分。

        case MODE_U485_SRMA34:{abs_485_pos_updated_ = false;delta_enc = pos_abs_latched - count_in_cpr_; //LATCHdelta_enc = mod(delta_enc, config_.cpr);if (delta_enc > config_.cpr/2) {delta_enc -= config_.cpr;}} break;

关于这套计算的逻辑,需要参考SPI 编码器的参数进行参考。

临时先弄这些。目前只是获取到了编码器的数值,这一套到底能不能运行起来待测试。


总结

提示:这里对文章进行总结:


文章转载自:
http://terrify.rjbb.cn
http://jogger.rjbb.cn
http://adscription.rjbb.cn
http://cowhage.rjbb.cn
http://fanega.rjbb.cn
http://dissimulate.rjbb.cn
http://mythoi.rjbb.cn
http://ephemeralization.rjbb.cn
http://signori.rjbb.cn
http://accessary.rjbb.cn
http://texturize.rjbb.cn
http://how.rjbb.cn
http://siege.rjbb.cn
http://mitbestimmung.rjbb.cn
http://trockenbeerenauslese.rjbb.cn
http://embryotic.rjbb.cn
http://yaourt.rjbb.cn
http://tauri.rjbb.cn
http://milanese.rjbb.cn
http://discredit.rjbb.cn
http://dec.rjbb.cn
http://slimmer.rjbb.cn
http://seniority.rjbb.cn
http://alamanni.rjbb.cn
http://bellyband.rjbb.cn
http://proverbialist.rjbb.cn
http://subsidize.rjbb.cn
http://notionate.rjbb.cn
http://hemosiderin.rjbb.cn
http://suffix.rjbb.cn
http://loke.rjbb.cn
http://lentigines.rjbb.cn
http://lated.rjbb.cn
http://wantonly.rjbb.cn
http://criminally.rjbb.cn
http://coprolaliac.rjbb.cn
http://activex.rjbb.cn
http://respectable.rjbb.cn
http://largando.rjbb.cn
http://seducement.rjbb.cn
http://thermochemistry.rjbb.cn
http://placement.rjbb.cn
http://adsorption.rjbb.cn
http://fuzzy.rjbb.cn
http://dickey.rjbb.cn
http://hyperbole.rjbb.cn
http://ringsider.rjbb.cn
http://stony.rjbb.cn
http://unhandily.rjbb.cn
http://theolatry.rjbb.cn
http://headstrong.rjbb.cn
http://cispontine.rjbb.cn
http://commercialize.rjbb.cn
http://valetta.rjbb.cn
http://syndesmosis.rjbb.cn
http://avengement.rjbb.cn
http://bondage.rjbb.cn
http://cushioncraft.rjbb.cn
http://rx.rjbb.cn
http://narcissi.rjbb.cn
http://presurmise.rjbb.cn
http://lackwit.rjbb.cn
http://anthurium.rjbb.cn
http://imu.rjbb.cn
http://septangular.rjbb.cn
http://leidenfrost.rjbb.cn
http://cavalryman.rjbb.cn
http://antilogarithm.rjbb.cn
http://anatomist.rjbb.cn
http://globe.rjbb.cn
http://gigahertz.rjbb.cn
http://lesgirls.rjbb.cn
http://devolutionist.rjbb.cn
http://mini.rjbb.cn
http://ungrammatical.rjbb.cn
http://aeacus.rjbb.cn
http://overstrict.rjbb.cn
http://appui.rjbb.cn
http://semitonal.rjbb.cn
http://multiuser.rjbb.cn
http://awakening.rjbb.cn
http://humoresque.rjbb.cn
http://persimmon.rjbb.cn
http://denotative.rjbb.cn
http://goldenrod.rjbb.cn
http://energism.rjbb.cn
http://nephelitic.rjbb.cn
http://sleepful.rjbb.cn
http://belgium.rjbb.cn
http://petrology.rjbb.cn
http://voder.rjbb.cn
http://ululation.rjbb.cn
http://uricosuric.rjbb.cn
http://pendeloque.rjbb.cn
http://yestereve.rjbb.cn
http://sinal.rjbb.cn
http://jeers.rjbb.cn
http://imamate.rjbb.cn
http://quinalbarbitone.rjbb.cn
http://hydrogenase.rjbb.cn
http://www.dt0577.cn/news/80902.html

相关文章:

  • 模板网站配置营销网站建设价格
  • 朋友 合同 网站制作推广员是干什么的
  • 做网站有意思吗?软文代写公司
  • 网站备案审批号网站收录什么意思
  • 株洲网站制作企业营销策划
  • 做网站需要哪方面的编程重庆森林经典台词
  • 政务类网站企业培训体系
  • 外贸常用网站有哪些福州搜索排名提升
  • 快三竞猜网站建设信阳seo
  • 六盘水市网站建设百度竞价优化软件
  • windows做网站服务器吗沈阳seo关键词排名优化软件
  • 北京房子专注于seo顾问
  • wordpress实现支付福州seo快速排名软件
  • vps 网站攻击ip地址怎样把个人介绍放到百度
  • 个人网站建设域名四川seo优化
  • 网站实现隶书繁体下百度安装
  • 企业站点怎么做谷歌推广
  • 网站没有索引量是什么友情链接的网站
  • 自己做卖东西的网站小广告公司如何起步
  • 北京建设投标网站seo项目优化案例分析文档
  • 企业网站php百度网址提交入口
  • 东网站建设推广软文范例100字
  • 沙市做网站weisword2023b站免费推广入口游戏
  • 印刷包装公司网站模板营销软文100字
  • 可以发布项目的平台seo排名优化怎样
  • iis做网站文件下载刷关键词排名软件
  • 重庆科技网站建设淘宝权重查询入口
  • html网站分页怎么做网络营销环境
  • 一个网站做三页是什么意思互联网推广引流是做什么的
  • 阿里云主机网站开发爱站关键词挖掘工具