stm32 SSI读编码器
void Init_PIC(void)
{
AS5311_CLK_H;
AS5311_CSN_DIS;
delay_ms(2);
AS5311_CSN_EN; //CLK为高电平时,CSN来个下降沿可以使能磁栅尺AB脉冲
delay_ms(100);
}
uint32_t read_AS5311chip(void)
{
uint32_t raw_value;// = 0;
uint16_t inputstream;// = 0;
uint16_t c;
inputstream = 0;
raw_value = 0;
AS5311_CLK_H;//digitalWrite(_clock, HIGH);
AS5311_CSN_H;//digitalWrite(_cs, HIGH);
delay_Systick_200ns(DELAYNUM);//delay_us(2);//
// AS5311_CLK_H;//digitalWrite(_clock, HIGH);
// delay_us(DELAYNUM);
AS5311_CSN_L;//digitalWrite(_cs, LOW);下降沿
delay_Systick_200ns(1);//delay_us(1);//
AS5311_CLK_L;//digitalWrite(_clock, LOW);
delay_Systick_200ns(DELAYNUM);//delay_us(2);
for (c = 0; c < 18; c++)
{
AS5311_CLK_H;//digitalWrite(_clock, HIGH);
delay_Systick_200ns(DELAYNUM);//delay_us(2);//
inputstream = GPIO_ReadInputDataBit(GPIO_AS5311_DO,PIN_AS5311_DO);//digitalRead(_data);
raw_value = ((raw_value << 1) + inputstream);
AS5311_CLK_L;//digitalWrite(_clock, LOW);
delay_Systick_200ns(DELAYNUM);//delay_us(2);//
}
AS5311_CLK_H;
// delay_us(10);
return raw_value;
}
void AS5311_AnalyzeSSICode(void) //获取0-4096
{
uint8_t cnt;
uint8_t cnt_1;
AS5311Dt.SSICode = read_AS5311chip();
// AS5311Dt.detail.Errcode = AS5311Dt.SSICode & 0x0000003F;
// AS5311Dt.detail.AbsCode = AS5311Dt.SSICode >> 6;
//检验数据是否有效 OCF COF LIN MagINC MagDEC Parity
// 1 0 0 不能同时为1 奇偶校验
//OCF 0 补偿算法未完成,bit11-0可能无效
//COF 1 溢出,bit11-0无效
//LIN 1 线性度不好,bit11-0无效,若出现需增强磁栅尺的强度
//MagINC MagDEC 磁场强度 ,1 1表示磁场强度若
//Parity 偶校验
if(3 == AS5311Dt.Class.Mag)
{ //磁栅尺信号弱
GbDt.Gb.SysAlm = AS5311WEAKERR;
}
else
{
if(4 != AS5311Dt.Class.Err)
{
GbDt.Gb.SysAlm = AS5311READYERR;
}
else
{
cnt = 18;
cnt_1 = 0;
Seg32data.all = 0x0000A8A1;//AS5311Dt.SSICode;
do
{
if(Seg32data.bits.bit0 == 1)
{
cnt_1++;
}
Seg32data.all = Seg32data.all >> 1;
}while(cnt--);
cnt_1 = cnt_1 % 2;
if(!cnt_1)
{
checkCounter();
switch(GbDt.Gb.SysAlm)
{
case AS5311READYERR: //准备错误
case AS5311WEAKERR: //信号弱
case AS5311EVENERR: //奇偶错误
GbDt.Gb.SysAlm = NORMAL;
break;
}
}
else
{ //偶校验失败
GbDt.Gb.SysAlm = AS5311EVENERR;
}
}
}
}
void checkCounter(void)
{
int32_t temp;
float Buf;
GlPara.Curpole = AS5311Dt.detail.AbsCode/1366; //[0,1366) 0;[1366,2732) 1;[2732,4095] 2
if (GlPara.Lastpole == 2 && GlPara.Curpole == 0)
{
GlPara.SSIcount++;
}
if (GlPara.Lastpole == 0 && GlPara.Curpole == 2)
{
GlPara.SSIcount--;
}
//lastEncoderVal = encoderVal;
GlPara.Lastpole = GlPara.Curpole;
//转换为nm
temp = AS5311Dt.detail.AbsCode;
temp = 200000*(temp - GlPara.ZeroCode)/4096;
temp += GlPara.SSIcount * 200000;
GlPara.SSICurPos = temp; //单位10nm=0.01um
// Buf = GlPara.SSICurPos;
// Buf = Buf * SSIPOS_TO_TPLS;
// GbDt.Gb.CrrntPstn[OPTMTR] = Buf;
}
void Init_Zero(void)
{
AS5311_AnalyzeSSICode();
GlPara.Lastpole = 1;
GlPara.ZeroCode = AS5311Dt.detail.AbsCode;
//checkCounter();
GlPara.SSIcount = 0;
}
注意不用SSI模式时,CSN下降沿时CLK要处于高电平状态,否则AB正交脉冲不对。这样可能出现干扰导致磁栅尺错误,从而可以做个这样的时序,就算出现干扰好也能恢复。
stm32 SSI读编码器相关推荐
- STM32定时器捕获编码器模式测速和方向测不准问题
** STM32定时器捕获编码器模式测速和方向测不准问题 问题概述 关于STM32编码器模式电机测速的资料网上一抓一大把,却发现真的拿过来用还是有问题的,比如刚刚做了个东西,是个个头比较大的麦克纳姆轮 ...
- STM32—TIMx实现编码器四倍频
文章目录 一.储备知识 二.TIMx的编码器模式介绍 1.计数边沿设置 2.选择极性和使能 3.使能 4.计数方向 三.代码部分 一.储备知识 通过STM32的定时器编码器接口模式对编码器进行四倍频, ...
- STM32应用(九)编码器及其测速原理、L298N电机驱动控制编码器电机
文章目录 1.L298N电机驱动 1.1 产品参数 1.2 实物图和接线 2.编码器 2.1 编码器简介 2.2 常用编码器分类 2.3 霍尔编码器实物图接线!!!! 2.4 编码器倍频原理 3.控制 ...
- STM32读取旋钮编码器
视频演示 #define ROTATE_A PAin(2) #define ROTATE_B PAin(3) s16 DATA=0;void EXTI2_IRQHandler(void) {if(EX ...
- STM32定时器---正交编码器模式详解
编码器分类: 按工作原理:光电式.磁电式和触点电刷式 按码盘的刻孔方式:增量式和绝对式两类 由于博主接触面还不是很广,一共就用过两个种类的编码器,都是属于光电的 差分编码器:一般由8根线连接 信号线分 ...
- STM32 EC11 旋转编码器
**先给大家看看我选用的EC11元器件** 代码在最后,复制可直接食用 以及我的电路图 在研究EC11的时序之前首先要了解一点,EC11按旋转的输出动作可以分为两种.一种是转两格,A.B对C端输出一个 ...
- STM32,读保护解锁
环境 正点原子STM32H743开发板,ST-LINK烧写器,ST-LINK Utility软件 现象 无法擦除.烧写.读出程序,提示Can not read memory(或从Flash读到全是00 ...
- STM32芯片读保护解锁
工具 开发板 USB-TTL模块 官方下载软件Flash loader demostrator 解除读写保护 一直next到这个页面(注意板子连接正常,boot0=1,boot1=0,中间可能有提示按 ...
- stm32 状态 读gpio_STM32单片机的GPIO模式解析
一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止.高低电平由IC的电源决定. 推挽电路是两个参数相同的三极管或M ...
- MT6701磁编码器使用指南,14Bit单圈绝对值,I2C stm32 HAL库读角度,兼容AS5600
MT6701是麦歌恩(MagnTek)公司的磁性角度传感器芯片,提供14Bit 0~360°单圈绝对角度检测,拥有 ABZ/PWM/模拟量/I2C/SSI 等多种信息输出方式,还可根据磁场强度的瞬 ...
最新文章
- 机器学习(三)--- scala学习笔记
- 图数据库Titan安装与部署
- c++面向对象的编程
- 赠书:分布式系统中的监控怎么做?
- php及时提醒反馈,php,实时交互_请问PHP脚本执行时如何实时提供反馈,php,实时交互 - phpStudy...
- 微博机器学习平台云上最佳实践
- mysql innodb monitor_mysql:innodb monitor(show engine innodb status)探秘
- FileZilla:425 Can't open data connection for transfer of解决办法
- Docker 学习5 Docker容器网络
- vivado.2019.1 安装教程
- Linux沙箱技术简介
- 互联网+脑科学,中国脑计划的机会
- 移动端网页的基础制作
- 这一周 火火火 的 GitHub 项目
- 如何用AVS Video Editor给视频添加文字?
- [学习打卡]Python基础入门(一)
- 全网最全pytest大型攻略,单元测试学这就够了
- IBM Guardium
- Spring MVC 如何实现RESTFull的 delete和put提交
- 联通大数据携U10峰会而来……