找回密码
 立即注册
查看: 1614|回复: 18

求助基于8h8k64u的108k雾化器程序

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-07-08 17:03:08

3

主题

9

回帖

47

积分

新手上路

积分
47
发表于 2024-7-5 18:07:00 | 显示全部楼层 |阅读模式
本帖最后由 zhaoxg686 于 2024-7-5 18:15 编辑

求助,使用STC8H8K64U单片机的P2.5端口输出108kHz的PWM波,并且使用定时器2


void timer2_ISR() interrupt 12{
  int  count = 0;
   
    // 每次中断更新P2.5的电平
    if (count < 14) { // 14是根据108kHz计算出来的值
        P2 ^= 0x20; // 翻转P2.5的电平
        count++;
    } else {
        count = 0;
    }
}

void main() {
    // 设置定时器0的工作模式为16位定时/计数器模式
    TMOD = 0x01;

    // 设置定时器0的初值
    // 设置定时器2的初值
                AUXR &= 0xFB;   
    T2H = (65536 - 1000) / 256;
    T2L = (65536 - 1000) % 256;
    // 开启定时器2中断
          AUXR |= 0x10;            //定时器2开始计时
    IE2 = 0x04;
    EA = 1;

    // 设置P2.5为输出模式
    P2M1 = 0x20; // P2.5设置为推挽输出

    while(1) {
        // 主循环体
    }
}

用上面的程序,输出只有0.46khz,请老师指正,谢谢。电路图如下


pwm.jpg




回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:459
  • 最近打卡:2025-05-07 09:02:26

3

主题

109

回帖

877

积分

高级会员

积分
877
发表于 2024-7-5 20:15:10 | 显示全部楼层
不是有PWM例程?为什么这么高频率使用中断翻转完成?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:368
  • 最近打卡:2025-05-06 00:20:05

6

主题

319

回帖

2218

积分

金牌会员

积分
2218
发表于 2024-7-5 20:30:46 | 显示全部楼层
0.46khz实测频率是那个位置测的?
mos经过电容隔直驱动的话,最终mos管gs电压幅值不是5V峰值,而是跟占空比有关,
50%占空比时候隔离电容两端会有2.5V左右直流偏置电压,如果占空比加大,输出到gs的电压有可能不足以开启mos管.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:368
  • 最近打卡:2025-05-06 00:20:05

6

主题

319

回帖

2218

积分

金牌会员

积分
2218
发表于 2024-7-5 21:13:18 | 显示全部楼层
本帖最后由 网老四 于 2024-7-5 21:38 编辑

上面程序里每1000个定时器时钟进一次中断,然后每次中断里IO口翻转一次,想要108khz输出频率,
那么反推回来,定时器中断频率应该也是108khz,定时器1000个时钟中断一次,那么定时器系统时钟应该是108Mhz,咱们STC能跑这么快?

关于超声雾化片驱动,为了提高雾化效率,雾化片通常工作在谐振模式,那么驱动mos管的占空比基本固定在50%左右.然后靠间歇工作的方式,调节工作和间歇时间比来调节雾化片平均输出功率.
我们可以设置单片机系统时钟为21.6Mhz,把定时器配置成时钟分频输出方式,定时器计数周期设为100,定时器溢出频率就等于216khz,每溢出一次,管脚翻转,这样就得到108khz方波输出信号,
也无需开启中断,主程序根据需要间歇开启和关闭定时器输出,就能实现雾化功率调节.当然,间歇开停功能,也可以由另外一个定时器作慢速PWM控制.

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:388
  • 最近打卡:2025-05-07 07:40:40

25

主题

113

回帖

739

积分

高级会员

积分
739
发表于 2024-7-5 22:10:48 | 显示全部楼层
本帖最后由 zhang32568 于 2024-7-5 22:13 编辑

void timer2_ISR() interrupt 12{
  int  count = 0;

你这里定义的时候赋值是0  每次进入中断都是0开始的  怎么能够累加到14 ?
第一次进入count=1.第二次进入的时候  首先执行int count=0,count由1变成0。
int count;就可以了。
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:368
  • 最近打卡:2025-05-06 00:20:05

6

主题

319

回帖

2218

积分

金牌会员

积分
2218
发表于 2024-7-5 22:57:39 | 显示全部楼层
zhang*** 发表于 2024-7-5 22:10
void timer2_ISR() interrupt 12{
  int  count = 0;

光用int count声明没用的,还是得用static 修饰下才行
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:526
  • 最近打卡:2025-05-07 07:52:42

109

主题

1909

回帖

5302

积分

论坛元老

积分
5302
发表于 2024-7-6 08:51:12 | 显示全部楼层
这么高的频率,应该PWM才能实现。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:519
  • 最近打卡:2025-05-07 03:58:34

24

主题

517

回帖

1014

积分

荣誉版主

积分
1014
发表于 2024-7-6 09:29:22 | 显示全部楼层
P2.5通过一个电阻直接驱动栅极。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-7-6 11:09:48 | 显示全部楼层
本帖最后由 Lkck8210 于 2024-7-6 11:34 编辑

108kHz方波
反转周期为1/(2*108k)=4.63us
以24Mhz单片机时钟为例
4.63u * 24M = 111.12
所以定时器的重装值等于
T2L=(65536-111)%256;
T2H=(65536-111)/256;
并设置P1.3脚输出时钟信号

或用12Mhz单片机时钟分频111输出
2024-07-06_113328.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-07-08 17:03:08

3

主题

9

回帖

47

积分

新手上路

积分
47
发表于 2024-7-6 17:37:52 | 显示全部楼层
谢谢
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-7 09:09 , Processed in 0.137451 second(s), 121 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表