Sound 发表于 2021-3-2 16:12:35

扩展库使用说明——PCA

本帖最后由 陈哲东 于 2021-6-30 15:03 编辑

1.硬件概述

STC8G 系列单片机内部集成了 3 组可编程计数器阵列(PCA/CCP/PWM)模块,可用于软件定时器、 外部脉冲捕获、高速脉冲输出和 PWM 脉宽调制输出。

2.   PCA结构
PCA 内部含有一个特殊的 16 位计数器,3 组 PCA 模块均与之相连接。PCA 计数器的结构图如下:

3.   引脚说明
STC8G系列的芯片,如果引脚数量不相同的话,那么他们所对应的PCA的功能引脚也是不相同的。在使能PCA的时候,带PCA功能的引脚将全部启用,并且要对这些引脚配置模式,一般是配置成双向I/O,或者是推挽输出。如果要将某个引脚的PCA功能关闭,那么就将相对应的引脚配置成高阻输入模式,即可关闭该引脚的PCA功能。




例如选用STC8G1K08A-8Pin单片机,使能PCA功能的时候,那么P32、P33、P34都将会配置成PCA模式,同时也要将三个引脚配置成双向I/O或者是推挽输出。如果要将P32引脚取消PCA功能,那么就将P32引脚配置成推挽输入模式即可取消P32引脚的PCA功能。

1.   PCA初始化时钟、引脚、中断、优先级。根据芯片型号选择对应的引脚。

2.   PCA通道初始化模式、宽度、中断模式、占空比。占空比为低电平时间。

3.   PCA实时更新占空比,占空比为低电平时间。

示例代码1

#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "mylib/STC8G_PCA.h"

void setup()
{
PCA_InitTypeDef PCA_InitStructure;

PCA_InitStructure.PCA_Clock    = PCA_Clock_1T; //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECI
PCA_InitStructure.PCA_IoUse    = PCA_IO_GROUP0; //PCA_IO_GROUP0, PCA_IO_GROUP1, PCA_IO_GROUP2
PCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //ENABLE, DISABLE
PCA_InitStructure.PCA_Polity   = Polity_0;//优先级设置 PolityHigh,PolityLow
PCA_InitStructure.PCA_RUN      = DISABLE; //ENABLE, DISABLE
PCA_Init(PCA_Counter,&PCA_InitStructure);

PCA_InitStructure.PCA_Mode   = PCA_Mode_PWM; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
PCA_InitStructure.PCA_PWM_Wide = PCA_PWM_8bit;//PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit, PCA_PWM_10bit
PCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
PCA_InitStructure.PCA_Value    = 128 << 8;//对于PWM,高8位为PWM占空比
PCA_Init(PCA0,&PCA_InitStructure);

PCA_InitStructure.PCA_Mode   = PCA_Mode_PWM; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
PCA_InitStructure.PCA_PWM_Wide = PCA_PWM_8bit;//PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit, PCA_PWM_10bit
PCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //PCA_Rise_Active, PCA_Fall_Active, DISABLE
PCA_InitStructure.PCA_Value    = 128 << 8;//对于PWM,高8位为PWM占空比
PCA_Init(PCA1,&PCA_InitStructure);

PCA_InitStructure.PCA_Mode   = PCA_Mode_PWM; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
PCA_InitStructure.PCA_PWM_Wide = PCA_PWM_8bit;//PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit, PCA_PWM_10bit
PCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //PCA_Rise_Active, PCA_Fall_Active, DISABLE
PCA_InitStructure.PCA_Value    = 128 << 8;//对于PWM,高8位为PWM占空比
PCA_Init(PCA2,&PCA_InitStructure);

P3M1&=~0x04;P3M0|=0x04;//推挽输出
P3M1|=0x08;P3M0&=~0x08;//高阻输入
P5M1|=0x10;P5M0&=~0x10;//高阻输入
CR = 1; //1: 允许PCA计数器计数,必须由软件清0。
}

void loop()
{
UpdatePwm(PCA0, 200);
}

void main(void)
{
setup();
while(1){
    loop();
}
}

acdc0616 发表于 2021-3-3 16:19:09

希望楼主在多扩展讲下其他功能的用法,比如 外部脉冲捕获、高速脉冲输出

感觉之灵感 发表于 2022-6-10 13:07:41

啥时候实现对stc8g1k08a的全功能支持?

yuchengcheng 发表于 2022-6-20 10:27:57

貌似不支持10位PWM,:'(

yuchengcheng 发表于 2022-6-20 21:03:45

yuchengcheng 发表于 2022-6-20 10:27
貌似不支持10位PWM,

我搞错了,原来支持的。。。UpDataPwm函数里有对高二位操作{:3_55:}

907580556 发表于 2023-6-6 22:50:13

怎么改成高电平时间呢:o
页: [1]
查看完整版本: 扩展库使用说明——PCA