集成两路MAX1169的STC8G1K08模块,带有两路PWM输出

举报
tsinghuazhuoqing 发表于 2021/12/26 22:45:27 2021/12/26
【摘要】   ■ 设计背景 在 集成有MAX1169,MAX520的DAAC单片STC8G1K08机电路板 中设计了集成有MAX1169的ADDA模块,对于一些需要使用PWM驱动的实验,这款模块还...

 

■ 设计背景


集成有MAX1169,MAX520的DAAC单片STC8G1K08机电路板 中设计了集成有MAX1169的ADDA模块,对于一些需要使用PWM驱动的实验,这款模块还无法进行集成实验。

设计集成有两路MAX1169以及PWM输出的测试模块可以为很多实验提供测量和驱动功能。

比如:

 

01电路模块设计


1.电路设计1

▲ SCH原理图设计

▲ SCH原理图设计

▲ PCB电路板和快速制版PCB的实验模块

▲ PCB电路板和快速制版PCB的实验模块

  • 实验接口:(从右往左定义1,2,3,4~8)
PIN1 2 3 4 5 6 7 8
+5V GND AIN AIN1 AGND PWM1 IO GND

2.单片机软件设计2

  • OSC工作频率:35MHz, UART:460800bps

设置STC8G1K08的关于I2C以及PACKAGE_SOP8 的共定义。

#define PACKAGE_SOP8        1
#define USSD_EN             0
#define I2C_EN              1
#define SPI_EN              0

  
 
  • 1
  • 2
  • 3
  • 4

(1) 软件说明

CCP2: 是PWM Channel3

(2) 串行命令

else IFARG0("maxstcpwm") {
    sscanf(SDA(1), "%d", &nNumber);
    PWM3SetPWM(0x3ff - nNumber);
} else IFARG0("maxstcread") {
    printf("%u %u\r\n", MAX1169Read(), MAX1169Read1());
} else IFARG0("maxstcreadb") {
    nNumber = MAX1169Read();
    SendChar((unsigned char)(nNumber >> 8));
    SendChar(nNumber);
    nNumber = MAX1169Read1();
    SendChar((unsigned char)(nNumber >> 8));
    SendChar(nNumber);
} else IFARG0("maxstcon") {
    ON(IO_PIN);
} else IFARG0("maxstcoff") {
    OFF(IO_PIN);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

 

02电路测试


1.PWM输出

  • 输出管脚: 3
  • PWM 频率:34.17kHz(示波器实测)

单片机工作频率: f o s c = 35 × 1 0 6 f_{osc} = 35 \times 10^6 fosc=35×106Hz,PWM的位数:10位。
理论上计算PWM频率为:

f P W M = f o s c 2 10 = 35 × 1 0 6 1024 = 34.18 k H z f_{PWM} = {{f_{osc} } \over {2^{10} }} = {{35 \times 10^6 } \over {1024}} = 34.18kHz fPWM=210fosc=102435×106=34.18kHz

设置命令: maxstcpwm n

◎ 调试说明:

在STC8G1K08等单片机中,对于CCAP0H的赋值必须紧接着XCAP0H的赋值,所以对于其中的PWM1SetPWM函数需要进行修改:

//------------------------------------------------------------------------------
#if PWM_CHANNEL1_EN
void PWM1SetPWM(unsigned int nPWM) {
#if PWM1_BIT == 10
    unsigned char ucPWM, ucPCA;
    ucPWM = (unsigned char)(nPWM >> 4);
    ucPWM &= 0x30;
    ucPCA = PCA_PWM0
    ucPCA &= 0xcf;
    ucPCA |= ucPWM;
    PCA_PWM0 = ucPCA;    
#endif // PWM1_BIT
    CCAP0H = (unsigned char)(nPWM & 0xff);
                                            // CCAP0H:Must be assign value after XCAP0H
                                            // is valued.
}
#endif //  PWM_CHANNEL1_EN
//------------------------------------------------------------------------------
#if PWM_CHANNEL2_EN
void PWM2SetPWM(unsigned int nPWM) {
#if PWM2_BIT == 10
    unsigned char ucPWM, ucPCA;
    ucPWM = (unsigned char)(nPWM >> 4);
    ucPWM &= 0x30;
    ucPCA = PCA_PWM0
    ucPCA &= 0xcf;
    ucPCA |= ucPWM;
    PCA_PWM1 = ucPCA;    
#endif // PWM2_BIT
    CCAP1H = (unsigned char)(nPWM & 0xff);
}
#endif //  PWM_CHANNEL2_EN
//------------------------------------------------------------------------------
#if PWM_CHANNEL3_EN
void PWM3SetPWM(unsigned int nPWM) {
#if PWM3_BIT == 10
    unsigned char ucPWM, ucPCA;
    ucPWM = (unsigned char)(nPWM >> 4);
    ucPWM &= 0x30;
    ucPCA = PCA_PWM2;
    ucPCA &= 0xcf;
    ucPCA |= ucPWM;    
    PCA_PWM2 = ucPCA;
#endif // PWM3_BIT
    CCAP2H = (unsigned char)(nPWM & 0xff);
}
#endif //  PWM_CHANNEL3_EN

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

2.IO输出

  • 输出管脚:2
    设置命令:maxstcon, maxstcoff

3. 两路AD

  • 对应管脚:PIN5,PIN6
    左边对应的: AD2
    右边对应的: AD1

 

03输入输出信号测试


1.对输出PWMRC滤波采集

▲ 对PWM输出RC滤波采集

▲ 对PWM输出RC滤波采集

2.对于IO口的RC波形采集

  • R= 10k, C = 100uF

▲ 对于IO口的RC波形进行采集

▲ 对于IO口的RC波形进行采集

使用scipy.optimize中的curve_fit函数对于上述采集数据进行指数拟合。
得到的参数为:[-6.71239337e+04 -9.76200318e-01 6.87801729e+04]
对应的表达式为:
y ( t ) = 6.878 × 1 0 4 − 6.712 × 1 0 4 × e − ( t × 0.976 ) y\left( t \right) = 6.878 \times 10^4 - 6.712 \times 10^4 \times e^{ - \left( {t \times 0.976} \right)} y(t)=6.878×1046.712×104×e(t×0.976)

其中的时间常数 τ = 0.976 s \tau = 0.976s τ=0.976s

这与 R ⋅ C = 1 s R \cdot C = 1s RC=1s很接近了。

▲ 进行数据拟合

▲ 进行数据拟合

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST2.PY                     -- by Dr. ZhuoQing 2020-07-23
#
# Note:
#============================================================
from headm import *
from scipy.optimize         import curve_fit
val = tspload('rcdata', 'val')
t = array(range(len(val))) * 0.01
def func(x, a, b, c):
    return a * exp(x*b) + c
param = [-10000, -0.1, 60000]
param, conv = curve_fit(func, t, val, p0=param)
printf(param)
fitval = func(t, *param)
#------------------------------------------------------------
plt.plot(t, val, label='measure')
plt.plot(t, fitval, label='fit')
plt.xlabel("Time(s)")
plt.ylabel("Output")
plt.grid(True)
plt.legend(loc='upper right')
plt.tight_layout()
plt.show()
#------------------------------------------------------------
#        END OF FILE : TEST2.PY
#============================================================

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

 

※ 结论


基于两颗MAX1169构成了两路的16bitAD转换模块。通过STM8G1K08-SOP8的CCP2输出PWM波形。PWM的频率为34kHz,分辨率为10bi。

在调试过程,修改了原来STC8G单片机中的PWMnSetPWM()中的函数。对于PWMn的赋值与PWM_CCP的赋值按照满足STC8G1K08数据手册中的一看球。


  1. 电路模块AD工程文件:AD\Test\2020\Tools\MAX1169STC8G1K08.PcbDoc * ↩︎

  2. 单片机软件工程文件:C51\STC\Test\2020\Tools\MAX1169STC8G1K08\MAX1169STC8G1K08.uvproj ↩︎

文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。

原文链接:zhuoqing.blog.csdn.net/article/details/107532306

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。