本帖最后由 noonezero 于 2023-11-16 09:34 编辑
第三十四课:单通道PWM输出
1.PWM配置流程和寄存器讲解
PWM输出框架示意图 图片太大,转压缩包
PWM输出框架示意图.zip
(4.31 MB, 下载次数: 181)
代码:
- #include <STC32G.H>
- #include "../COMM/stc32_stc8_usb.h"
-
- void sys_init();
-
- //USB调试及复位所需定义
- char *USER_DEVICEDESC = NULL;
- char *USER_PRODUCTDESC = NULL;
- char *USER_STCISPCMD = "@STCISP#";
-
- #define PWM_ARR 999
- #define PWM_CCR 500
-
- // PWMA初始化
- // 输出频率:sysclk / (pscr + 1)/(arr + 1) = 22118400 / 1 / (999 + 1) = 22118.4hz = 22.1184khz
- // 占空比:ccr/ (arr + 1) * 100% = 500/(999+1) = 50%
- void PWMA_Init(void)
- {
- // 时钟选择,默认22.1184
-
- // 时基单元选择
- PWMA_PSCRH = 0; // 1分频
- PWMA_PSCRL = 0;
-
- PWMA_ARRH = (u8)(PWM_ARR >> 8);
- PWMA_ARRL = (u8)PWM_ARR;
-
- PWMA_CCR1H = (u8)(PWM_CCR >> 8);
- PWMA_CCR1L = (u8)PWM_CCR;
-
- // 输入输出引脚配置
- PWMA_ENO = 0x00; // 使能PWM1通道输出
- PWMA_ENO |= 0x01;
-
- PWMA_PS = 0x00; // 选择PWM1从P60引脚输出
- PWMA_PS |= (2<<0);// 选择PWM1从P60引脚输出
-
- // 输入输出模式设置
- PWMA_CCER1 = 0x00;
- PWMA_CCMR1 = 0x68; // PWM模式1,配置置位输出
- PWMA_CCER1 = 0x01; // 开启输出比较通道
-
- PWMA_BKR = 0x80; // 使能主输出
- PWMA_CR1 |= 0x01; // 启动计数器
-
- }
-
-
- void main()
- {
- sys_init();
-
-
- IRC48MCR = 0x80; // 使能内部48M的USB专用IRC
- while(!(IRC48MCR & 0x01));
- USBCLK = 0x00; // 设置USB时钟源为内部48M的USB专用IRC
- USBCON = 0x90; // 使能USB功能
-
- usb_init(); // 调用USB CDC初始化库函数
- EA = 1;
- EUSB = 1; // 使能USB中断
-
- while(DeviceState != DEVSTATE_CONFIGURED); // 等待USB配置完成
-
- P40 = 0;
- P61 = 0;
- PWMA_Init();
-
- while(1)
- {
- if (bUsbOutReady) // 当硬件接收完成上位机通过串口助手发送数据后会自动将
- { // bUsbOutReady 置1
- USB_SendData(UsbOutBuffer, OutNumber); // 接收的数据字节数保存在OutNumber变量中
- usb_OUT_done(); // 接收的数据保存在UsbOutBuffer缓存区
- printf("lailelaodi");
- } // 使用USB_SendData库函数可向上位机发送数据
- // 调用usb_OUT_done 准备接收下一笔数据
-
- }
- }
-
- void sys_init()
- {
- WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
- EAXFR = 1; //扩展寄存器(XFR)访问使能
- CKCON = 0; //提高访问XRAM速度
-
- P0M1 = 0x30; P0M0 = 0x30; //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
- P1M1 = 0x32; P1M0 = 0x32; //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
- P2M1 = 0x3c; P2M0 = 0x3c; //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
- P3M1 = 0x53; P3M0 = 0x50; //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
- // P30/P31和USB的D-/D+共用PIN脚 需要将P30 P31设置为高阻输入模式
- P4M1 = 0x3c; P4M0 = 0x3c; //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
- P5M1 = 0x0c; P5M0 = 0x0c; //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
- P6M1 = 0xff; P6M0 = 0xff; //设置为漏极开路(实验箱加了上拉电阻到3.3V)
- P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
- }
复制代码
|