找回密码
 立即注册
楼主: zhange

【冲哥版】stc32学习心得

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-26 17:22:11 | 显示全部楼层
本帖最后由 zhange 于 2024-5-26 17:59 编辑

第三十二集:串口EEPROM芯片数据读写

1.24c02 不需要擦除扇区既可以写入。

2.函数移植前,要先了解函数的功能。

3.编译出现错误,一般改掉第一个错误就好了。。

4.强制转换数据类型(char)(int)

5.这节课对我的项目作用不大,大致看了下,没细看。。。。

6.cdc串口可以实现任意波特率,以前没研究,这个以后得研究呀。。。

====等二刷吧====








回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-26 18:03:47 | 显示全部楼层
本帖最后由 zhange 于 2024-5-26 21:13 编辑

第三十三集:PWM基础


1.波形

截图202405261803265150.jpg


2.stc32带16位PwM控制器, 但是他远没表面看起来这么简单!! PwM+PFM+各种方波的输入检测和输出都可以实现!!


3.幅值
截图202405262014366714.jpg


4.幅值:高低电平电压差
正脉宽:高电平时间
负脉宽:低电平时间
周期:高电平+低电平时间
频率:周期的倒数
占空比:一般指高电平时间占周期时间的百分比
死区:两路方波之间高电平之间的时间差
相位差:方波移相


5. pwm应用:灯光调节  电机速度等



截图202405262017181287.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-26 21:28:06 | 显示全部楼层
本帖最后由 zhange 于 2024-5-27 11:00 编辑

第三十四集:单通道PWM输出上

1.1刷没记住啥?????

====二刷吧====

1.PWMA 适用于许多不同的用途:

基本的定时
测量输入信号的脉冲宽度(输入捕获)
产生输出波形(输出比较,PWM 和单脉冲模式)
对应与不同事件(捕获,比较,溢出,刹车,触发)的中断
PWMB 或者外部信号(外部时钟,复位信号,触发和使能信号)同步
PWMA 广泛的适用于各种控制应用中,包括那些需要中间对齐模式 PWM 的应用,该模 式支持互补
输出和死区时间控制。
PWMA 的时钟源可以是内部时钟,也可以是外部的信号,可以通过配置寄存器来进行选择。


2.
  1. void PWMA_Init(void)                        //PWMA的初始化
  2. {
  3.         //1.时钟源选择  这里不改,默认22.1184mhz
  4.         
  5.         //2.时基单元选择
  6.         PWMA_PSCRH = 0;                                //1分频
  7.         PWMA_PSCRL = 0;
  8.         
  9.         PWMA_ARRH  = (u8)(PWM_ARR>>8);  //自动重装寄存器高位
  10.         PWMA_ARRL  = (u8)(PWM_ARR);
  11.         
  12.         PWMA_CCR1H  = (u8)(PWM_CCR>>8);  //捕获比较寄存器
  13.         PWMA_CCR1L  = (u8)(PWM_CCR);        
  14.         
  15.         
  16.         //3.输入输出的引脚配置
  17.         PWMA_ENO = 0X00;                        //使能PWM1n通道输出
  18.         PWMA_ENO |= 0X02;
  19.         
  20.         PWMA_PS =0x00;                                //选择PWM1从P60引脚输出
  21.         PWMA_PS |= (2<<0);        
  22.         
  23.         //4.输入输出模式设置
  24.         PWMA_CCER1 = 0X00;
  25.         PWMA_CCMR1 = 0X68;                        //pwm模式1 配置置位输出
  26.         PWMA_CCER1 = 0x04;                        //开启输出比较通道
  27.         
  28.         PWMA_BKR = 0X80;                        //使能主输出
  29.         
  30.         PWMA_CR1 |= 0X01;                        //启动计数器
  31. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-27 14:48:44 | 显示全部楼层
本帖最后由 zhange 于 2024-5-27 14:59 编辑

第三十四集:续


1.使用自动重载,时序如下图,当当前值没有溢出之前仍是前一个溢出值,溢出完以后才是新设置的溢出值。

一般推荐使用自动重载。防止pwm失控

截图202405271444443077.jpg

2.计数模式:上下计数(边缘对齐),中央对齐模式

3.ccr比较值  arr溢出值


4.先使能通道,再选择引脚。

5.想要接到外部pwm信号,必须接到p通道上。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-27 16:44:12 | 显示全部楼层
第三十四集:单通道PWM输出下


1.开始写代码之前先背一下步骤

  • 1.确定时钟
  • 2.选择时基
  • 3.引脚配置
  • 4.输出模式配置


2.要写就要和老师的有点区别。

宏定义:
#define PWM_ARR 1999
#define PWM_CCR 200

时钟:默认的系统时钟

时基:

PWMA_PSCRH = 0;  //2分频
PWMA_PSCRL = 0x02;

PWMA_ARRH =  (u8)(PWM_ARR>>8);
PWMA_ARRL = (u8)(PWM_ARR);

PWMA_CCR1H =(U8)(PWMCCR>>8);
PWMA_CCR1L = (U8)PWM_CCR;

引脚配置


PWMA_ENO = 0X00;
PWMA_ENO |=0X01;    //选择p60
PWMA_PS =0x00;       
PWMA_PS |= 0X02;
       
//4.输入输出模式设置
PWMA_CCER1 = 0X00;
PWMA_CCMR1 = 0X68;                        //pwm模式1 配置置位输出
PWMA_CCER1 = 0x03;                        //开启输出比较通道
       
PWMA_BKR = 0X80;                        //使能主输出
       


使能计数器
PWMA_CR1 |= 0X01;

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-28 07:53:43 | 显示全部楼层
本帖最后由 zhange 于 2024-5-28 08:56 编辑

第三十五集:任意频率和占空比的PWM输出上


1.频率计算公式:SYSclk/((PSCR+1)*(ARR+1))

SYSclk:系统时钟  arr:溢出值    pscr:分频   arr和pscr最大值65535   (2的16次方)

要计算20khz的频率就可已根据上面的公式计算出在系统频率为22.1184兆hz时,分频为0,arr为1105

2.互补同向pwm输出。
  • 如何使能互补/同相输出?
  • 1.使能ENO寄存器,打开互补输出的通道
  • 2.CCERx寄存器打开比较输出使能
  • 如何设置输出的另一半波形是互补还是同相?
  • 1.CCERx寄存器设置比较输出极性(如果要输出同向,可以吧p和n的极性设为相反,就是ccr(比较值)和cnt(当前计数器值)  比较  输出的高低电平)


3.死区计算

截图202405280849435868.jpg

如果死区寄存器设置为  00001111    计算公式为   00001111 * 系统时钟1个周期时间   比如系统频率为24Mhz   死区时间为  0.625微秒


如果死区寄存器设置为11111111   计算公式为 (32 + DTGn[4:0]) * 16 * tCK_PSC    32+31=63*16=1008    1008/24 = 42微秒 系统频率为24Mhz





回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-28 09:00:01 | 显示全部楼层
死区计算学会了   谢谢冲哥  看了两遍
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-28 09:25:52 | 显示全部楼层
第三十五集:任意频率和占空比的PWM输出下



====熊的,毕业了。。。。。====

1.电机正反转原理(这里接的直流电机)

切换正负极可以实现正反转。

2.控制代码
  1. void PWMA1_Set(int pwm)
  2. {
  3.         if( pwm==0 )                //电机停止
  4.         {
  5.                 //1p 1n均为低电平
  6.                 PWMA_CCR1H = 0;
  7.                 PWMA_CCR1L = 0;
  8.                 PWMA_ENO &= 0XFC;                //关闭1p 1n通道
  9.                 PWM1P = 0;
  10.                 PWM1N = 0;
  11.         }
  12.         else if( pwm>0 )                //电机正转
  13.         {
  14.                 if( pwm >(PWM_ARR+1) )
  15.                         pwm = (PWM_ARR+1);
  16.                
  17.                 PWMA_CCR1H = (u8)(pwm>>8);
  18.                 PWMA_CCR1L = (u8)(pwm);        
  19.                 PWMA_ENO &= 0XFC;                //关闭1p 1n通道
  20.                 PWMA_ENO |= 0X01;                        //使能PWM1p通道输出
  21.                 PWM1N = 0;
  22.         }
  23.         else if( pwm<0 )                //电机反转
  24.         {
  25.                 pwm = -pwm;
  26.                 if( pwm >(PWM_ARR+1) )
  27.                         pwm = (PWM_ARR+1);
  28.                
  29.                 PWMA_CCR1H = (u8)(pwm>>8);
  30.                 PWMA_CCR1L = (u8)(pwm);        
  31.                 PWMA_ENO &= 0XFC;                //关闭1p 1n通道
  32.                 PWMA_ENO |= 0X02;                        //使能PWM1n通道输出
  33.                 PWM1P = 0;        
  34.         }        
  35. }
复制代码



====熊的,毕业了。。。。。====

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-06-17 07:01:20

62

主题

830

回帖

1552

积分

金牌会员

积分
1552
发表于 2024-5-28 09:27:13 | 显示全部楼层


完结了      完结了

必须写代码  测试去了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:374
  • 最近打卡:2025-06-17 07:50:49

20

主题

221

回帖

953

积分

高级会员

积分
953
发表于 2024-11-5 08:27:25 | 显示全部楼层
zha*** 发表于 2024-5-28 09:25
第三十五集:任意频率和占空比的PWM输出下

学习了。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-19 05:54 , Processed in 0.136952 second(s), 96 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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