找回密码
 立即注册
查看: 481|回复: 2

请教一下PWMB产生正弦波的问题 | 已解决

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:16:56

3

主题

25

回帖

1333

积分

金牌会员

积分
1333
发表于 2024-9-26 15:40:35 | 显示全部楼层 |阅读模式

程序抄的是这个帖子第一个50hz的
产生正弦波的几种方法,有高速的,也有硬件超级简单的,波形发生器
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3593
(出处: 国芯技术交流网站)

使用的是8051U,PWMA P10口输出正常,可以看到占空比的变化,但是使用PWMB 切换到P50口,输出不正常了,1是波形不正常,2是占空比不会变化。
请教各位老师帮我看看,是什么地方的问题
P10口输出波形
2.jpg


P50口输出波形
1.jpg


P50口相关电路图
3.jpg


代码如下

  1. #include "../comm/AI8051U.h"  //包含此头文件后,不需要再包含"reg51.h"头文件
  2. #include "usb.h"     //USB调试及复位所需头文件
  3. #include "T_SineTable.h"
  4. #include "stdio.h"
  5. #define MAIN_Fosc       35000000L   //定义主时钟
  6. char *USER_DEVICEDESC = NULL;
  7. char *USER_PRODUCTDESC = NULL;
  8. char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令
  9. //P3.2口按键复位所需变量
  10. bit Key_Flag;
  11. u16 Key_cnt;
  12. u16 PWMB_Duty;
  13. u8        PWMB_Index=0;        //SPWM查表索引
  14. u16 PWMA_Duty;
  15. u8        PWMA_Index=0;        //SPWM查表索引
  16. void sys_init();
  17. void delay_ms(u8 ms);
  18. void KeyResetScan(void);
  19. //输出正弦波频率 = 35000000 / 175 / 200 = 1000 HZ.
  20. //                                                      0xAF
  21. //
  22. //pwm
  23. void pwmA_Init()
  24. {
  25.         PWMA_Duty = 1220;
  26.     PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
  27.     PWMA_CCER2 = 0x00;
  28.     PWMA_CCMR1 = 0x68; //通道模式配置
  29.     PWMA_CCER1 = 0x01; //配置通道输出使能和极性
  30.     //PWMA_ARRH = 0x09; //设置周期时间
  31.     //PWMA_ARRL = 0x60;
  32.         PWMA_ARRH = 0x00; //设置周期时间1k
  33.         PWMA_ARRL = 0xAE;
  34.         
  35.     PWMA_CCR1H = (u8)(PWMA_Duty >> 8); //设置占空比时间
  36.     PWMA_CCR1L = (u8)(PWMA_Duty);
  37.     //PWMA_DTR = 0x0C;   //设置死区时间
  38.     PWMA_ENO = 0x00;
  39.     PWMA_ENO |= 1; //使能输出
  40.     //PWMA_ENO |= 2; //使能输出
  41.     //高级PWM输出脚会自动设置为推挽输出模式
  42.     PWMA_PS = 0x00;  //高级 PWM 通道输出脚选择位
  43.     PWMA_PS |= 0; //选择 PWM1_1 通道
  44.     PWMA_BKR = 0x80; //使能主输出
  45.     PWMA_IER = 0x01; //使能中断
  46.     PWMA_CR1 |= 0x81; //使能ARR预装载,开始计时
  47. }
  48. void PWMA_ISR() interrupt PWMA_VECTOR
  49. {
  50.     if(PWMA_SR1 & 0X01)
  51.     {
  52.         PWMA_SR1 &=~0X01;
  53.         PWMA_Duty = T_SinTable[PWMA_Index];
  54.         if(++PWMA_Index >= 200)        PWMA_Index = 0;
  55.         PWMA_CCR1H = (u8)(PWMA_Duty >> 8); //设置占空比时间
  56.         PWMA_CCR1L = (u8)(PWMA_Duty);
  57.     }
  58.     PWMA_SR1 = 0;
  59. }
  60. //输出正弦波频率 = 35000000 / 175 / 200 = 1000 HZ.
  61. //                                                      0xAF
  62. //
  63. //pwm
  64. void pwmB_Init()
  65. {
  66.         PWMB_Duty = T_SinTable[0];
  67.     PWMB_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
  68.     PWMB_CCER2 = 0x00;
  69.     PWMB_CCMR1 = 0x68; //通道模式配置
  70.     PWMB_CCER1 = 0x01; //配置通道输出使能和极性
  71.         PWMB_ARRH = 0x00; //设置周期时间1k
  72.         PWMB_ARRL = 0xAE;
  73.         
  74.     PWMB_CCR5H = (u8)(PWMB_Duty >> 8); //设置占空比时间
  75.     PWMB_CCR5L = (u8)(PWMB_Duty);
  76.     PWMB_ENO = 0x00;
  77.     PWMB_ENO |= 1; //使能输出
  78.     //PWMA_ENO |= 2; //使能输出
  79.     //高级PWM输出脚会自动设置为推挽输出模式
  80.     PWMB_PS = 0x03;  //高级 PWM 通道输出脚选择位 P5.0
  81.     PWMB_BKR = 0x80; //使能主输出
  82.     PWMB_IER = 0x43; //使能中断
  83.     PWMB_CR1 |= 0x81; //使能ARR预装载,开始计时
  84. }
  85. void PWMB_ISR() interrupt PWMB_VECTOR
  86. {
  87.     if(PWMB_SR1 & 0x01)
  88.     {
  89.         PWMB_SR1 &=~0X01;
  90.         PWMB_Duty = T_SinTable[PWMB_Index];
  91.         if(++PWMB_Index >= 200)        PWMB_Index = 0;
  92.         PWMB_CCR5H = (u8)(PWMB_Duty >> 8); //设置占空比时间
  93.         PWMB_CCR5L = (u8)(PWMB_Duty);
  94.     }
  95.     PWMB_SR1 = 0;
  96. }
  97. void main()
  98. {
  99.     sys_init();
  100.         
  101.         IRC48MCR = 0x80;
  102.     while (!(IRC48MCR & 0x01));
  103.    
  104.     USBCLK = 0x00;
  105.     USBCON = 0x90;
  106.         
  107.         usb_init();                                     //USB CDC 接口配置
  108.     EUSB=1;                                     //使能USB中断                                 
  109.     EA = 1;
  110.    
  111.     while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  112.         pwmB_Init();
  113.         pwmA_Init();
  114.     while (1)
  115.     {
  116.         delay_ms(1);
  117.         KeyResetScan();   //长按P3.2口按键触发软件复位,进入USB下载模式,不需要此功能可删除本行代码
  118.         if (bUsbOutReady)
  119.         {
  120.             USB_SendData(UsbOutBuffer,OutNumber);    //发送数据缓冲区,长度
  121.             usb_OUT_done();
  122.         }
  123.     }
  124. }
  125. void sys_init()
  126. {
  127.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  128.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  129.     CKCON = 0; //提高访问XRAM速度
  130.     P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  131.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  132.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  133.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  134.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  135.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  136.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  137.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  138.         P3M0 &= ~0x03;
  139.     P3M1 |= 0x03;
  140. }
复制代码



回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:09:43
已绑定手机

77

主题

4850

回帖

8388

积分

超级版主

DebugLab

积分
8388
发表于 2024-9-26 16:17:46 | 显示全部楼层
PWMB_IER不要使能触发中断,不要允许捕获/比较5中断,仅允许更新中断
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:16:56

3

主题

25

回帖

1333

积分

金牌会员

积分
1333
发表于 2024-9-26 18:56:40 | 显示全部楼层
Debu*** 发表于 2024-9-26 16:17
PWMB_IER不要使能触发中断,不要允许捕获/比较5中断,仅允许更新中断

感谢,可以了,之前中断号错了,以为是这里的问题,就改了,后来忘记改回来了
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 00:45 , Processed in 0.124175 second(s), 61 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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