FX3U 45MR 21DI 24RO 14AD 2DA源代码,stm32f103芯片全套源码,可以直接用GX Works2编程直接写入,非常适合参考学习。 原理图,pcb,请使用ad软件打开。

最近在整理工控项目资料时翻出一套FX3U方案,21个数字量输入+24路继电器输出的配置特别适合中小型设备控制。搭配14位AD采集和双通道DA输出,连温控、压力传感这类模拟量需求都能搞定。最爽的是这个方案直接用了STM32F103C8T6做主控,三菱PLC的梯形图逻辑和底层驱动源码全开源。

先看个简单的数字量处理代码段:

// 输入端口映射
volatile uint16_t *DI_Port = (uint16_t*)0x40011000; 
// 输出锁存寄存器
__IO uint32_t *RO_Latch = (uint32_t*)0x40011410;

void DI_Scan_Task(void) {
    static uint16_t last_state = 0;
    uint16_t current = *DI_Port & 0x1FFF; // 取低13位对应21点输入
    uint16_t changes = current ^ last_state;
    
    if(changes) {
        for(uint8_t i=0; i<16; i++){
            if(changes & (1<<i)) {
                // 触发事件队列
                Event_Push(i, (current>>i)&0x1);
            }
        }
        last_state = current;
    }
}

这段代码用位操作实现输入状态比对,volatile修饰确保直接访问硬件寄存器。0x1FFF掩码对应前13个输入点,后面8个输入点其实挂在另一个扩展端口,这里用了双端口扫描策略。事件队列机制避免在中断里处理复杂逻辑,这个设计在工控场景下特别重要——你总不希望某个传感器的抖动让整个系统卡死吧?

FX3U 45MR 21DI 24RO 14AD 2DA源代码,stm32f103芯片全套源码,可以直接用GX Works2编程直接写入,非常适合参考学习。 原理图,pcb,请使用ad软件打开。

AD采集模块用了过采样提升精度:

#define OVERSAMPLE_TIMES 64
int32_t AD_GetValue(uint8_t ch) {
    ADC1->SQR3 = ch;
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    
    int32_t sum = 0;
    for(uint8_t i=0; i<OVERSAMPLE_TIMES; i++){
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
        sum += ADC1->DR;
    }
    return sum >> 3; // 64次平均相当于右移6位,配合校准参数右移3位得14bit
}

硬件SPI配置DA输出时有个坑:STM32的SPI时钟相位要和DA芯片匹配。有次调试发现输出波形畸变,最后发现是CPHA配置反了:

void DA_Init(void) {
    SPI_InitTypeDef spi;
    spi.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    spi.SPI_Mode = SPI_Mode_Master;
    spi.SPI_DataSize = SPI_DataSize_16b;
    spi.SPI_CPOL = SPI_CPOL_High;  // 重点在这两个参数
    spi.SPI_CPHA = SPI_CPHA_2Edge; // 对应DA芯片的锁存边沿
    spi.SPI_NSS = SPI_NSS_Soft;
    spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
    SPI_Init(SPI2, &spi);
}

原理图用Altium Designer打开时会看到个有趣设计:数字地和模拟地之间用了磁珠并联10nF电容。这种混合接法在同时存在继电器和精密ADC的板子上比单纯0Ω电阻更可靠,能兼顾高频干扰和静电释放。

整套代码在GX Works2里跑的时候要注意时钟树配置,STM32的72MHz主频需要拆分成:

  • 8MHz晶体输入
  • PLL 9倍频
  • 系统时钟=72MHz
  • APB1=36MHz
  • APB2=72MHz

最后留个调试彩蛋:当发现某些输出点异常抖动时,检查GPIO的复用功能重映射寄存器是不是被其他外设修改了。有次CAN总线初始化代码误操作了AFIO->MAPR寄存器,导致三个输出端口集体罢工——这种隐蔽问题用示波器抓端口波形立马现形。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐