用一片STC来做个光栅尺的可行性
芯片用STC32G12K128 有更适合更好#include "STC32G.h"
框架如下:
//==================== 引脚定义 ====================
// 8相激励输出(对应40指动栅)
#define EXC1 P10
#define EXC2 P11
#define EXC3 P12
#define EXC4 P13
#define EXC5 P14
#define EXC6 P15
#define EXC7 P16
#define EXC8 P17
// 2路正交信号输入
#define SIGA P20
#define SIGB P21
// 按键
#define KEY_MMP30// inch/mm
#define KEY_ONP31// ON/OFF
#define KEY_ZERO P32 // ZERO
// LCD驱动(示例:4COM + 8SEG)
#define COM1 P00
#define COM2 P01
#define COM3 P02
#define COM4 P03
#define SEG_A P04
#define SEG_B P05
#define SEG_C P06
#define SEG_D P07
//==================== 全局变量 ====================
int32_t position = 0;
uint8_t phase = 0;
bit power_on = 1;
bit inch_mode = 0;
uint16_t idle_timer = 0;
// 段码表(0~9,LCD定义修改)
const uint8_t seg_table = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//==================== 基础函数 ====================
void delay_ms(uint16_t ms)
{
uint16_t i,j;
for(i=0;i<ms;i++)
for(j=0;j<1000;j++);
}
// 8相激励输出
void excite_drive(void)
{
EXC1=EXC2=EXC3=EXC4=EXC5=EXC6=EXC7=EXC8=0;
switch(phase)
{
case 0: EXC1=1; break;
case 1: EXC2=1; break;
case 2: EXC3=1; break;
case 3: EXC4=1; break;
case 4: EXC5=1; break;
case 5: EXC6=1; break;
case 6: EXC7=1; break;
case 7: EXC8=1; break;
}
phase = (phase + 1) % 8;
}
// 正交信号4倍频解码
void read_sensor(void)
{
static uint8_t last_a;
uint8_t a = SIGA;
uint8_t b = SIGB;
if(a != last_a)
{
if(a != b) position++;
else position--;
}
last_a = a;
}
STC32G12K128如何做光栅
STC32G12K128是一款性能强大的国产32位单片机,它本身并不能“做”光栅,但可以作为核心控制器,来处理来自光栅传感器的信号,从而实现诸如计数、测速、测角等应用。
这里所说的“光栅”通常指的是光栅传感器(也称光电编码器),它是一种通过光栅的光学遮挡原理来输出脉冲信号的装置。
下面为你详细解析如何使用STC32G12K128来处理光栅信号。
🧠 核心原理光栅传感器会输出两路相位差为90度的方波脉冲信号,通常称为A相和B相。
[*]计数:通过计算脉冲的数量,可以得知物体移动的距离或旋转的角度。
[*]测速:通过计算单位时间内的脉冲数量,可以得出速度。
[*]辨向:通过判断A相和B相信号的相位先后关系,可以确定运动的方向(正转或反转)。
STC32G12K128的优势在于其内部集成了多个定时器/计数器,并且支持硬件正交解码功能。这意味着你可以将光栅的A、B相信号直接连接到单片机的特定引脚上,由硬件自动完成脉冲计数和方向判断,极大地减轻了CPU的软件负担,保证了计数的准确性和实时性。
🔧 实现步骤1. 硬件连接
[*]电源:将光栅传感器的VCC和GND分别连接到STC32G12K128的5V(或3.3V)和GND引脚。
[*]信号线:将光栅传感器的A相和B相信号输出线,连接到STC32G12K128支持定时器输入捕获或正交解码功能的I/O口。具体引脚需要查阅STC32G的数据手册,通常是T0、T1、T2等定时器对应的外部输入引脚。
2. 软件配置软件部分的核心是配置定时器工作在计数器模式或正交解码模式。
[*]查阅手册:首先,你需要找到STC32G系列单片机的数据手册,确认哪个定时器(如Timer0, Timer1)支持外部脉冲输入和正交解码功能,并找到对应的引脚。
[*]配置定时器:
[*]将定时器设置为计数器模式(Counter Mode),而非定时模式(Timer Mode)。
[*]如果单片机支持硬件正交解码,则配置相应的寄存器,使能该功能。这样,硬件会自动根据A、B相的相位关系进行加计数或减计数。
[*]如果不支持硬件正交解码,可以只连接A相,将定时器配置为对A相脉冲进行计数。方向判断则需要通过外部中断读取B相的电平状态来由软件实现。
[*]读取数据:在主程序循环或定时器中断中,直接读取定时器的计数值(如TL0, TH0寄存器),这个值就是光栅产生的脉冲数。
3. 数据处理
[*]计算位移/角度:位移 = 脉冲数 × 光栅分辨率。光栅分辨率是指每个脉冲代表的物理长度或角度。
[*]计算速度:可以通过一个固定时间(如100ms)内的脉冲数来计算,或者通过测量两个脉冲之间的时间间隔来计算。
⚠️ 重要区分:光栅 vs. 光电循迹需要特别注意的是,不要将“光栅”与“光电循迹”混淆。
[*]光栅/编码器:输出的是数字脉冲信号,用于精确的计数和测速。
[*]光电循迹/灰度传感器:通常使用红外对管(如TCRT5000),通过检测地面反射光的强度来判断黑白线。它输出的是模拟电压信号,需要连接到单片机的ADC(模数转换器)引脚进行处理。STC32G12K128内置了高性能的ADC,非常适合处理这类传感器信号。
总而言之,使用STC32G12K128处理光栅信号,关键在于利用其定时器/计数器的硬件功能来高效、准确地读取脉冲,而不是通过软件去模拟或轮询。
千问在手,敌可望,STC 亦可往 神农鼎 发表于 2026-4-21 15:56
千问在手,敌可望,STC 亦可往
千问哪个模型适合单片机 谢谢回复 调整方向,非接触性的类似码识别
有这方面资料 插空问一下这个怎么读算?
数显卡尺
页:
[1]