找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2089|回复: 8
打印 上一主题 下一主题
收起左侧

请教关于STC8H单片机比较输出PWM的疑问

[复制链接]
跳转到指定楼层
楼主
各位大佬我又来了,这次是遇到的问题是这样,使用比较器输出固定的频率和占空比驱动舵机,按照查到的资料设置频率和占空比后舵机只有在2.5%,10%的时候才会动,而且动的角度也有问题,按照舵机的资料对应的占空比应该是0.5MS->25%, 1MS->5%, 1.5ms->7.5%,2MS->10%,2.5MS->12.5%,由于才开始摸这个芯片不是很了解,请各位大佬赐教。频率设置的是20毫秒,单片机程序如下:

#include "STC8H.h"
void pwma_init(unsigned long f_pwm_set);
void main()
{
   pwma_init(480000);  //  24M,设置50HZ频率(24000000)*(1/50) = 480000
        
        while(1)
        {
         }
}

void CH1_PWM_SET(unsigned long f_set_ch1,float duty_ch1)  //设置占空比
{
  float a;
        a = duty_ch1 * f_set_ch1;
        P_SW2 |= 0x80;
        PWMA_CCR1H = ((unsigned int)(a))/256;
        PWMA_CCR1L = ((unsigned int)(a))%256;
        PWMA_CCMR1 = 0x60;
        PWMA_CCER1 &= 0xFD;
        PWMA_CCER1 |= 0x01;
        PWMA_OISR |=0x01;
        PWMA_ENO |= 0x01;
        P_SW2 &= 0x7f;
}

void pwma_init(unsigned long f_pwm_set)  //频率设置
{
  P1M0 = 0xfe;
        P1M1 = 0xfe;
        
        P_SW2 |= 0x80;
        PWMA_CR1 &=0xfe;
        PWMA_ARRH = f_pwm_set/256;
        PWMA_ARRL = f_pwm_set%256;
        PWMA_CR1 &= 0x8f;
        P_SW2 &= 0x7f;
        
        CH1_PWM_SET(f_pwm_set,2.5);  占空比2.5%
        
        P_SW2 |= 0x80;
        PWMA_BKR = 0x80;
        PWMA_CR1 |= 0x01;
        P_SW2 &= 0x7F;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:159419 发表于 2022-11-11 14:33 | 只看该作者
后来用定时器的方法测试了下是没有问题的,看来应该是频率或者占空比设置的地方有问题,请各位大佬帮忙看看是哪里出了问题
回复

使用道具 举报

板凳
ID:161164 发表于 2022-11-11 17:29 | 只看该作者








CCR = 20352
ARR = 13568
PWM Hz = 24000000/20353 = 1179 Hz
PWM % = 13568/20353 = 66.66%
回复

使用道具 举报

地板
ID:161164 发表于 2022-11-13 17:15 | 只看该作者
更正
回复

使用道具 举报

5#
ID:159419 发表于 2022-11-15 15:07 | 只看该作者
大佬,感谢之前的解答,我根据这个思路重新改写了程序,但是还是无法达到效果,我把程序贴上来,注释部分是我根据查到资料的理解,麻烦帮忙看看是哪里有问题

P1M0 = 0XFE;
        P1M1 = 0XFE;
       
         CLKDIV = 0x18;     //主时钟24M, 24分频使用1M时钟作为计数器时钟

  P_SW2 |= 0X80;
        PWMA_CR1 &= 0XFE;   //关闭计数器   
        PWMA_ARRH = 0X4E;   //20000转16进制为4E20    ARR的值为一个PWM的周期长度
        PWMA_ARRL = 0X20;
        PWMA_CR1 &= 0X8F;  //向上计数,边沿对齐

        PWMA_CCR1H = 0X0f;   //4000转16进制为FA0,  CCR的值为周期内高电平的时间
        PWMA_CCR1L = 0Xa0;   
        PWMA_CCMR1 = 0x60;   //PWM1模式
        PWMA_CCER1 |= 0XFD;  //信号高电平有效
        PWMA_CCER1 &= 0X01; //使能0C1输出
        PWMA_OISR |= 0X01;    //空闲状态输出高电平
        PWMA_ENO |= 0X01;     //使能PWM1P输出
         
        PWMA_BKR = 0X80;      //开启使能总开关
        PWMA_CR1 |= 0X01;   //打开计数器
        P_SW2 &= 0X7F;
}

//  1000000/20000 = 50HZ
//   4000/20000 = 20%
回复

使用道具 举报

6#
ID:1088441 发表于 2023-7-14 09:52 | 只看该作者
楼主想问你这个PWM是设置的哪路输出呀,我在stc8h上设置P5.4输出PWM实现不了嘞
回复

使用道具 举报

7#
ID:1034262 发表于 2023-7-14 16:58 | 只看该作者
示波器看过信号吗?
回复

使用道具 举报

8#
ID:427868 发表于 2023-7-17 18:18 | 只看该作者
楼主的程序中没见设置分频寄存器_PSCR,也就是说PWM没有分频,在24MHZ时钟下,16位的ARR(ARRH+  ARRL)最大数值为65536,PWM最长周期是2.73ms.如果想得到20ms的周期,必须分频才行。480000的数值已经超过16位了,赋值给ARRHE CCER,会溢出的。
回复

使用道具 举报

9#
ID:427868 发表于 2023-7-17 18:32 | 只看该作者
shendu0900 发表于 2022-11-15 15:07
大佬,感谢之前的解答,我根据这个思路重新改写了程序,但是还是无法达到效果,我把程序贴上来,注释部分是 ...

你修改的这个虽然设置了 CLKDIV,欲降低系统时钟,但P_SW2 |= 0X80;没有写在CLKDIV(地址FE01H)之前,会导致无法给CLKDIV赋值的,也就是初始化时系统时钟分频无效,仍然是24MHZ的时钟。从运行速度考虑,不建议那么低的系统时钟,只需分频PWM时钟即可。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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