ZhangYiGen 发表于 2024-9-14 16:29:19

8G1K08A-36I-SOP8 怎么输出可调频率和占空比的PWM?

新接触STC8G1K08A-36I-SOP8单片机,
感觉比较迷你好玩,想入坑玩玩,
但是奈何针对stc8g1k08a的教程比较少,
今想利用stc8g1k08a-8pin实现输出可调频率和占空比的PWM,
越简单越好,看的手册算利用pca好像可行,
但是要操作各种寄存器,占空比计算比较复杂,
有大佬指导一下?

DebugLab 发表于 2024-9-14 16:48:08

8G1K08A,3路PCA输出PWM程序(已测试通过):
void PWM_Out(unsigned int pwm_0,pwm_1,pwm_2)
{
      unsigned char temp_l,temp_h,temp;
      
      temp_l=pwm_0&0x00ff;                //读pwm_0低8位赋值给temp_l
      temp_h=(pwm_0&0x0300)>>4;      //读pwm_0高2位,移动到XCCAP0H(PCA_PWM0)位置,赋值给temp_h
      temp=PCA_PWM0&0xcd;                        //读PCA_PWM0,XCCAP2H(PCA_PWM0)、EPC0H(PCA_PWM0)清零后赋值给temp
      temp_h|=temp;                              //写其他位到temph
      if(pwm_0==0x03ff)                        //如果pwm_0最大
                temp_h|=0x02;                        //设置EPC0H(PCA_PWM0)为1
      PCA_PWM0=temp_h;                        //写PCA_PWM0(先写高2位)
      CCAP0H=temp_l;                              //写CCAP0H(再写低8位)
      
      temp_l=pwm_1&0x00ff;                //读pwm_1低8位赋值给temp_l
      temp_h=(pwm_1&0x0300)>>4;      //读pwm_1高2位,移动到XCCAP1H(PCA_PWM1)位置,赋值给temp_h
      temp=PCA_PWM1&0xcd;                        //读PCA_PWM1,XCCAP1H(PCA_PWM2)、EPC1H(PCA_PWM1)清零后赋值给temp
      temp_h|=temp;                              //写其他位到temph
      if(pwm_1==0x03ff)                        //如果pwm_1最大
                temp_h|=0x02;                        //设置EPC1H(PCA_PWM1)为1
      PCA_PWM1=temp_h;                        //写PCA_PWM1(先写高2位)
      CCAP1H=temp_l;                              //写CCAP1H(再写低8位)
      
      temp_l=pwm_2&0x00ff;                //读pwm_2低8位赋值给temp_l
      temp_h=(pwm_2&0x0300)>>4;      //读pwm_2高2位,移动到XCCAP2H(PCA_PWM2)位置,赋值给temp_h
      temp=PCA_PWM2&0xcd;                        //读PCA_PWM2,XCCAP2H(PCA_PWM2)、EPC2H(PCA_PWM2)清零后赋值给temp
      temp_h|=temp;                              //写其他位到temph
      if(pwm_2==0x03ff)                        //如果pwm_2最大
                temp_h|=0x02;                        //设置EPC2H(PCA_PWM2)为1
      PCA_PWM2=temp_h;                        //写PCA_PWM2(先写高2位)
      CCAP2H=temp_l;                              //写CCAP2H(再写低8位)
}


void Init(void)
{
      P_SW2|=EAXFR;
      P3M0=0x00;
      P3M1=0x00;
      P5M0=0x00;
      P5M1=0x00;
      
      CCON=0x00;                              //设置PCA控制寄存器
      CMOD=0x80;                              //设置空闲模式下PCA停止计数,禁止PCA计数器溢出中断,设置PCA时钟为系统时钟/12(900Hz)
      CL=0x00;                              //设置PCA计数器
      CH=0x00;                              //设置PCA计数器
      CCAPM0=PWM0;                        //使能PCA模块0PWM功能
      PCA_PWM0=0xc0;                        //设置PCA模块0输出10位PWM
      CCAPM1=PWM1;                        //使能PCA模块1PWM功能
      PCA_PWM1=0xc0;                        //设置PCA模块1输出10位PWM
      CCAPM2=PWM2;                        //使能PCA模块2PWM功能
      PCA_PWM2=0xc0;                        //设置PCA模块2输出10位PWM
      CR=1;                                        //启动PCA
}


void main(void)
{
      Init();
      while(1)
      {
                PWM_Out(A,B,C);
      }
}

神农鼎 发表于 2024-9-14 16:50:25





8G1K08A-36I-SOP8的管脚比较特殊

神农鼎 发表于 2024-9-14 16:51:12


神农鼎 发表于 2024-9-14 16:52:44






ZhangYiGen 发表于 2024-9-14 16:54:00

DebugLab 发表于 2024-9-14 16:48
8G1K08A,3路PCA输出PWM程序(已测试通过):
void PWM_Out(unsigned int pwm_0,pwm_1,pwm_2)
{


占空比和频率怎么修改?

神农鼎 发表于 2024-9-14 16:54:14


这个程序可以认真学习下

神农鼎 发表于 2024-9-14 16:55:10

ZhangYiGen 发表于 2024-9-14 16:54
占空比和频率怎么修改?

看说明书,PCA部分要看 12个小时

ZhangYiGen 发表于 2024-9-14 16:57:35

神农鼎 发表于 2024-9-14 16:55
看说明书,PCA部分要看 12个小时

这。。。。,已经看半天了{:shocked:}

DebugLab 发表于 2024-9-14 16:58:09

ZhangYiGen 发表于 2024-9-14 16:54
占空比和频率怎么修改?
通过CMOD.CPS设置


页: [1] 2 3
查看完整版本: 8G1K08A-36I-SOP8 怎么输出可调频率和占空比的PWM?