AI8H2K12U-45I-SOP8自制光耦测试工具
网上开源光耦测试工具是用ne555芯片,既然学习stc单片机,本人觉得应该用单片机PWM功能实现光耦监测,虽然有点浪费,但总得学用。https://www.stcaimcu.com/forum.php?mod=image&aid=107944&size=300x300&key=fed24bb147c39351&nocache=yes&type=fixnone
https://www.stcaimcu.com/forum.php?mod=image&aid=107945&size=300x300&key=30b4863843e9c0d3&nocache=yes&type=fixnone程序可移植芯片手册中的代码。
本人也是业余初学者,本着共同进步想法,抛砖引玉,多多赐教
作为一名国芯人工智能的开发者,很高兴看到您在学习STC单片机的过程中,尝试用PWM功能实现光耦测试工具。这种实践精神非常值得鼓励。
您提到使用STC8H2K12U-45I-SOP8芯片自制光耦测试工具,并计划用单片机的PWM功能替代传统的NE555方案,这体现了对单片机功能的深入理解和应用意识。虽然从硬件资源角度来看,使用单片机实现这一功能可能看似“浪费”,但正是通过这样的实践,能够更好地掌握单片机的编程逻辑、定时器控制以及外围电路设计等关键技能。
关于程序部分,您提到可以移植芯片手册中的代码,这是一个非常好的切入点。STC系列单片机的开发通常依赖于其官方提供的数据手册和示例代码,合理利用这些资源能够显著提高开发效率。建议在编写代码时注意以下几点:
1. PWM配置:根据光耦测试的需求,合理设置PWM的频率和占空比,确保输出信号稳定且符合测试要求。
2. ADC采集:如果需要监测光耦的输出电压,应结合ADC模块进行采集,确保数据精度。
3. 中断与延时:在实际测试中,可能需要使用定时器中断或软件延时来控制测试节奏,提升系统的实时性与稳定性。
4. 代码可移植性:在编写代码时尽量采用模块化结构,便于后续移植到其他型号的STC芯片中。
此外,建议在开发过程中注重代码注释与文档记录,这对于后期调试、优化以及分享经验都非常有帮助。同时,也可以参考社区中的开源项目,借鉴他人思路,进一步完善自己的设计。
作为国芯人工智能的一员,我们一直致力于推动国产芯片技术的发展与普及。希望您在学习和实践中不断积累经验,未来能够在更多领域中发挥单片机的潜力,为智能硬件的发展贡献力量。
如果您在开发过程中遇到任何问题,欢迎随时交流探讨,共同进步。
[本文内容由国芯人工智能辅助生成,仅供参考] 既然觉得浪费,可以尝试搞个高级一点的,比如用两路PWM,一路调驱动脉宽一路调驱动电流,来个自动扫描,不但可以测光耦功能,还可以估算光耦的性能,推测一些基本参数。这样会实用很多了。 代码移植部分,仅供参考;有更好的实现方法和更多的功能请无私赐教,谢谢
因为AI8H2K12U-45I-SOP8只有8个引脚,资源比较紧张,pwm6在1号引脚,要设置成p5.4,二楼大佬的建议很好,本人软硬件均刚入门,奢望大佬们给出具体方案,竭尽全力榨干8H2K12U-SOP8芯片价值,发挥最大功效,弃用国外的芯片的目的
main.h文件
#ifndef _MAIN_H
#define _MAIN_H
#define MAIN_Fosc 24000000L //������ʱ��
#endif
main.c文件
#include "main.h"
#include "STC8H2K12U.h"
#include "PWM.H"
void main(void)
{
P3M0 |= (0x03); //P3.0,P3.1准双向口
P3M1 &= ~(0x03);
P3M1 |= (0x0C); //P3.2,P3.3高阻
P3M0 &= ~(0x0C);
P5M1 &= ~0x10; //P5.4准双向口
P5M0 |= 0x10;
PWM6_config();
EA =1;
P32=1;
while (1)
{
}
}
pwm.h文件
#ifndef _PWM_H
#define _PWM_H
void PWM6_config(void);
#endif
pwm.c文件
#include "PWM.H"
#include "STC8H2K12U.h"
void PWM6_config(void)
{
P_SW2 |= 0x80; //使能访问扩展RAM区特殊功能寄存器SFR
PWMB_CCER1&= ~0x10; //写CCMR2前关闭CC6E通道
PWMB_CCMR2&= ~0x03; //CC6S输出
PWMB_CCMR2&= ~0x70; //OC6M3位置0;
PWMB_CCMR2|=0x60; //PWM模式1输出:110
PWMB_CCER1|= 0x10; // 开启比较输出, 高电平有效
PWMB_ENO |= 0x04; // 使能输出
PWMB_CCR6 = 2000; // 比较值, 控制占空比(高电平时钟数)
PWMB_PS |= 0x04; // 选择IO,00:选择P2.1,01:选择P5.4,10:选择P0.1,11:选择P7.5
PWMB_PSCR = 5; // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
PWMB_DTR= 24; // 死区时间配置, n=0~127: DTR= n T, 0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,
// 0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T, 0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
PWMB_ARRH = 0x0F; // 自动重装载寄存器,控制PWM周期
PWMB_ARRL = 0x9F;
PWMB_CCMR2 |= 0x08; // 通道模式配置, PWM模式1, 预装载允许
PWMB_BKR = 0x80; // 主输出使能 相当于总开关
PWMB_CR1 = 0x81; // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
PWMB_EGR = 0x01; //产生一次更新事件, 清除计数器和与分频计数器, 装载预分频寄存器的值
// PWMA_ISR_En = PWMA_IER; //设置标志允许通道1~4中断处理
}
页:
[1]