vb2002 发表于 2024-7-11 01:21:11

重新再记录一下自己的学习历程吧.

PWM 分类

目前我知道的stc8g 里面有两类pwm ,一个是pca的pwm ,分6,7,8,10位.stc8g还有一个15位增强型的pwm
然后就是stc8h和stc32g里面的 16位pwm,也叫高级pwm
学到哪,记到哪,可能会跳跃式的学习.






_奶咖君_ 发表于 2024-7-11 08:42:14

跳着学 希望别学混了{:4_167:}

vb2002 发表于 2024-7-11 10:32:21

_奶咖君_ 发表于 2024-7-11 08:42
跳着学 希望别学混了

就是有时候用到哪学到哪,学不懂了再去看看另外的视频

vb2002 发表于 2024-7-11 12:05:31

配置8位pwm步骤
    CCON = 0x00;   

CMOD = 0x08;   默认系统时钟

    CCAPM2 = 0x42;    开启PWM2和PCA比较功能

vb2002 发表于 2024-7-11 12:10:08

注意要选择相应的端口,需要配置P_SW1,CCP_S位分组的,不能单独拆散
最后记得CR=1 ;启动PCA计数


vb2002 发表于 2024-7-11 12:13:24

    CCAP2L = 0x00;                  
    CCAP2H = 0x00;
可以调节占空比, 如果是8位,可以写成 CCAP2L=CCAP2H=0x00; (0x00可以用定义变量,以后用变量进行调整)

选择开启 6,7,8,10位pwm

vb2002 发表于 2024-7-11 12:30:08

本帖最后由 vb2002 于 2024-7-11 12:33 编辑

#include <STC8G.H>      头文件
#include "intrins.h"      lop不会报错

#define MAIN_Fosc 11059200UL   定义系统时钟
unsigned int pwm_levels[] = {5,15,95,255 };   设置 pwm_levels[]={数组,方便接下来的按键换挡}

unsigned char PWM_SAVE;       设置变量,保存当前pwm的亮度
sbit KEY1 = P3^2;                   KEY1设置成 P32 io口
bit key_flag;                           设置标志位,,标志位具体什么用处,现在我还不清楚
unsigned char PWM_MODE;       定义PWM模式的变量
unsigned char time_out;            定义一个定时器时钟,方便设置多少秒内按键是一个状态,多少秒后另一个状态


void PWM_init(void)             学C语言的时候, 说void是古老的写法,新的写法可以是   int代替void.
{
    CCON = 0x00;            
    CMOD = 0x08;
    CL = 0x00;
    CH = 0x00;

    CCAPM2 = 0x42;
    PCA_PWM2 = 0x00;
    CCAP2L = 0x00;                  
    CCAP2H = 0x00;
      CR=1;      
}

void PWM_updata(unsigned int duty)         // 更新PCA捕获/比较1寄存器,以改变PWM输出
{   
if(duty > 0)                           // 如果占空比大于0   
{      
CCAP1L = duty;                     // 更新PCA捕获/比较1低字节寄存器   
CCAP1H = duty >> 8;                  // 更新PCA捕获/比较1高字节寄存器   
CCAP1H右移8位,同步ccap1l      
CCAPM1 = 0x42;                     // 使能PCA捕获/比较1模块的PWM输出
   }   
else
{      CCAP1L = 0x00;                     // 清除PCA捕获/比较1低字节寄存器      
CCAP1H = 0x00;                     // 清除PCA捕获/比较1高字节寄存器      
CCAPM1 = 0x00;                     // 禁用PCA捕获/比较1模块的PWM输出   
}
}

void Timer0_Isr(void) interrupt 1         // 定时器0的中断服务程序
{   
static unsigned char key_sta;            // 按键状态机变量   
    switch(key_sta)                        // 实现去抖动和按键检测的状态机
    {      case 0:                              // 等待按键   
      if (KEY1 == 0) key_sta++;         // 如果按键按下,进入状态1
         break;      case 1:                              // 确认按键         
if (KEY1 == 0) key_sta++;         // 如果按键持续按下,进入状态2         
else key_sta = 0;                // 否则返回状态0         
   break;      case 2:                              // 等待按键释放   
      if (KEY1 == 1) key_sta++;         // 如果按键释放,进入状态3   
      break;      case 3:                              // 按键完成         
key_flag = 1;                  // 设置按键标志位            
key_sta = 0;                     // 重置状态机         
break;   
   default:                           // 默认状态,重置状态机      
      key_sta = 0;      
    break;
}   
if (time_out < 20) time_out++;         // 如果未超时,增加超时计数器}


vb2002 发表于 2024-7-11 15:31:43

还可以把程序写进中断里
中断记得配置
void Timer0_Init(void)                //100微秒@11.0592MHz
{
        AUXR |= 0x80;                        //定时器时钟1T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xAE;                                //设置定时初始值
        TH0 = 0xFB;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}
        IT0=1;
        EX0=1;
        EA=1;
中断里面只能执行一次,不能像主循环里面一直闪.
中断里面好像还能再嵌套中断.研究一下

vb2002 发表于 2024-7-11 21:41:16

中断配置
INT0 外部中断





vb2002 发表于 2024-7-11 21:45:31

INT1 外部中断
INT0和1的配置差不多,
但是到了INT2,3,4了,不好找,我找了好一会才搞出来




页: [1] 2
查看完整版本: 重新再记录一下自己的学习历程吧.