找回密码
 立即注册
查看: 1460|回复: 8

求助,8G1K08A-36I-SOP8,想得到一个20ms周期的pwm

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-04-07 01:22:42

6

主题

11

回帖

222

积分

中级会员

积分
222
发表于 2023-2-6 10:27:34 | 显示全部楼层 |阅读模式
想用 8G1K08A-36I-SOP8 驱动舵机,请问如何才能得到一个周期为20ms,精度为2us的脉冲

例程上貌似PAC高速脉冲可以达到这种效果,但是芯片手册上对高速脉冲的介绍几笔带过,不是很清楚
请大佬帮忙讲解一下,感谢
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2023-2-6 12:13:49 | 显示全部楼层
使用PCA高速输出,分辨率1us。
舵机使用的是1.000~2.000ms的PPM信号,分辨率1us可以到1000步。
建议使用STC8H系列带16位PPM的单片机,不需要软件中断处理。
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-04-28 08:49:07
已绑定手机

90

主题

961

回帖

2318

积分

超级版主

积分
2318
QQ
发表于 2023-2-6 12:17:36 | 显示全部楼层
STC8H8K64U-45Mhz-TSSOP20 ,高级PWM,1.9元含税,硬件USB,支持USB下载 USB仿真    我觉得这个最适合
热线19952583534
www.STCAI.com
  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-04-07 01:22:42

6

主题

11

回帖

222

积分

中级会员

积分
222
发表于 2023-2-6 14:25:15 | 显示全部楼层
国学*** 发表于 2023-2-6 12:17
STC8H8K64U-45Mhz-TSSOP20 ,高级PWM,1.9元含税,硬件USB,支持USB下载 USB仿真    我觉得这个最适合
...

感谢

16

主题

57

回帖

366

积分

中级会员

积分
366
发表于 2024-10-22 09:57:13 | 显示全部楼层
梁*** 发表于 2023-2-6 12:13
使用PCA高速输出,分辨率1us。
舵机使用的是1.000~2.000ms的PPM信号,分辨率1us可以到1000步。
建议使用STC ...

请问我这部分我已经实现了, 但是我有个疑问, 因为我舵机周期是20ms的, 我pwm的控制频率可以是1ms吗?或者这么做会有什么影响吗?

点评

舵机的PPM信号是20ms,就要用20ms周期的PWM产生PPM信号去控制舵机。 一般舵机最短可以接受周期为4ms左右的PPM信号,根据具体响应速度要求确定周期。  详情 回复 发表于 2024-10-22 10:59
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2024-10-22 10:59:40 | 显示全部楼层
peiti*** 发表于 2024-10-22 09:57
请问我这部分我已经实现了, 但是我有个疑问, 因为我舵机周期是20ms的, 我pwm的控制频率可以是1ms吗?或者这 ...

舵机的PPM信号是20ms,就要用20ms周期的PWM产生PPM信号去控制舵机。
一般舵机最短可以接受周期为4ms左右的PPM信号,根据具体响应速度要求确定周期。
回复 支持 反对

使用道具 举报 送花

16

主题

57

回帖

366

积分

中级会员

积分
366
发表于 2024-10-22 11:43:22 | 显示全部楼层
梁*** 发表于 2024-10-22 10:59
舵机的PPM信号是20ms,就要用20ms周期的PWM产生PPM信号去控制舵机。
一般舵机最短可以接受周期为4ms左右 ...

好的, 感谢
回复 支持 反对

使用道具 举报 送花

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

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-10-22 11:51:39 | 显示全部楼层
本帖最后由 Lkck8210 于 2024-10-22 13:09 编辑

首先把PAC的时钟设为2us(12Mhz/2,24Mhz/4)

2024-10-22_114202.png

然后中断里选择电平的维持时间
  1. unsigned int value;
  2. unsigned int Hvalue = 500;//500 * 2us = 1000us
  3. #define Lvalue (10000 - Hvalue)
  4. void PCA_Isr() interrupt 7
  5. {
  6.     CCF0 = 0;
  7.     CCAP0L = value;
  8.     CCAP0H = value >> 8;
  9.         if(P32)
  10.         {
  11.                 value += Hvalue;
  12.         }else{
  13.                 value += Lvalue;
  14.         }
  15. }
复制代码
以上代码没实验过,可能电平判断那里要取反一下
回复 支持 反对

使用道具 举报 送花

16

主题

57

回帖

366

积分

中级会员

积分
366
发表于 2024-10-22 14:53:31 | 显示全部楼层
这是我用的stc8g08a-8pin代码, 可以参考一下, 我测下来还行, io口设置的是p32 p33 p55

  1. #include "driver/pca.h"
  2. static u16 g_pwm_tmps[2];
  3. static u16 g_pwm_highs[2]={PCA_T1US*500, PCA_T1US*2500};
  4. static u16 g_pwm_lows[2]={PWM_DUTY-PCA_T1US*500, PWM_DUTY-PCA_T1US*2500};
  5. void PCA_Init(void)
  6. {
  7.         CCON = 0x00;
  8.     CMOD = 0x00;                                //PCA时钟为系统时钟12分频
  9.     CL = 0x00;
  10.     CH = 0x00;
  11.         CCAPM1 = 0x4d;                              //PCA模块0为16位定时器模式并使能脉冲输出
  12.     g_pwm_tmps[0] = PCA_T1US*500;
  13.     CCAP1L = g_pwm_tmps[0];
  14.     CCAP1H = g_pwm_tmps[0] >> 8;
  15.     g_pwm_tmps[0] += PCA_T1US*500;
  16.         CCAPM2 = 0x4d;
  17.         g_pwm_tmps[1] = PCA_T1US*500;
  18.         CCAP2L = g_pwm_tmps[1];
  19.         CCAP2H = g_pwm_tmps[1] >> 8;
  20.         g_pwm_tmps[1] += PCA_T1US*500;
  21.     CR = 1;                                     //启动PCA计时器
  22. }
  23. void UpdatePCA(u8 pin, u16 pwm_high)
  24. {
  25.     CR = 0;
  26.         g_pwm_highs[pin] = pwm_high*PCA_T1US;
  27.         g_pwm_lows[pin] = PWM_DUTY-g_pwm_highs[pin];
  28.         CR = 1;
  29. }
  30. void PCA_Isr() interrupt 7
  31. {
  32.         if(CCF1) {
  33.                 CCF1 = 0;
  34.                 if(P33)        g_pwm_tmps[0] += g_pwm_highs[0];       
  35.                 else        g_pwm_tmps[0] += g_pwm_lows[0];       
  36.                 CCAP1L = g_pwm_tmps[0];
  37.                 CCAP1H = g_pwm_tmps[0] >> 8;
  38.         }
  39.         if(CCF2) {
  40.                 CCF2 = 0;
  41.                 if(P55) g_pwm_tmps[1] += g_pwm_highs[1];
  42.                 else   g_pwm_tmps[1] += g_pwm_lows[1];
  43.                 CCAP2L = g_pwm_tmps[1];
  44.                 CCAP2H = g_pwm_tmps[1] >> 8;
  45.         }
  46.     if(CF) CF = 0;                       
  47. }
  48. #ifndef __PCA_H__
  49. #define __PCA_H__
  50. #include "firmware/config.h"
  51. #define         PCA_T1US             (MAIN_Fosc / 12 / 1000000)        // 1us 12分频
  52. #define                PWM_DUTY                (20000*PCA_T1US)                        // 20ms
  53. void PCA_Init(void);
  54. void UpdatePCA(u8 pin, u16 pwm_high);
  55. #endif // __PCA_H__
复制代码



回复 支持 1 反对 0

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 13:01 , Processed in 0.132692 second(s), 114 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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